Поддерживает ли RTMP сообщение SEI ориентации дисплея в потоках h264? - PullRequest
0 голосов
/ 29 мая 2020

Я транслирую видео в формате h264 и аудио AA C через RTMP на Android с использованием собственных API-интерфейсов MediaCode c. Видео и аудио выглядят великолепно, однако, пока видео снимается в портретном режиме, воспроизведение в Интернете или с VL C всегда в альбомной ориентации.

Прочитав h264 spe c, я вижу, что такого рода дополнительные метаданные можно указать в Supplemental Enhancement Information (SEI), и я уже добавил их в необработанный битовый поток h264. Мой блок SEI NAL для этого следует этому элементарному формату, я планирую оптимизировать позже:

val displayOrientationSEI = {
    val prefix = byteArrayOf(0, 0, 0, 1)
    val nalHeader = byteArrayOf(6) // forbidden_zero_bit:0; nal_ref_idc:0; nal_unit_type:6 

    val display = byteArrayOf(47 /* Display orientation type*/, 3 /*payload size*/)

    val displayOrientationCancelFlag = "0" // u(1); Rotation information follows
    val horFlip = "1" // hor_flip; u(1); Flip horizontally
    val verFlip = "1" // ver_flip; u(1); Flip vertically
    val anticlockwiseRotation = "0100000000000000" // u(16); value / 2^16 -> 90 degrees
    val displayOrientationRepetitionPeriod = "010" // ue(v); Persistent till next video sequence
    val displayOrientationExtensionFlag = "0" // u(1); No other value is permitted by the spec atm
    val byteAlignment = "1"

    val bitString = displayOrientationCancelFlag +
            horFlip +
            verFlip +
            anticlockwiseRotation +
            displayOrientationRepetitionPeriod +
            displayOrientationExtensionFlag +
            byteAlignment

    prefix + nalHeader + display + BigInteger(bitString, 2).toByteArray()
}()

Используя Jcode c класс SEI , я вижу, что мое сообщение SEI разобраны правильно. Я записываю эти пакеты в поток RTMP, используя Android JNI-оболочку для LibRtmp .

Несмотря на это, ffprobe не показывает метаданные ориентации, и видео при воспроизведении остается в альбомной ориентации. .

Здесь я думаю, что мне не хватает очень маленькой детали о том, как работают заголовки FLV, когда необработанные блоки h264 записываются LibRtmp. Я попытался добавить этот displayOrientationSEI блок NAL:

  1. Только к исходной конфигурации SPS и PPS.
  2. К каждому необработанному блоку NAL h264 прямо из кодировщика.
  3. Для обоих.

Что я делаю не так? Просматривая источник некоторых библиотек RTMP, таких как rtmp-rtsp-stream-client- java, кажется, что при создании тегов FLV сообщение SEI пропадает.

Помощь очень много, очень признателен.

1 Ответ

1 голос
/ 29 мая 2020

Поддерживает ли RTMP сообщение SEI ориентации дисплея в потоках h264?

RTMP не знает самой концепции. с точки зрения RTMP, SEI - это просто серия копируемых байтов. Он никогда не смотрит на них, никогда не анализирует их.

То, что нужно для его поддержки, - это декодер h.264 (о котором RTMP также не знает) и программное обеспечение проигрывателя. Если это у вас не работает, вы должны проверить плеер или действительность закодированного SEI, а не транспорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...