Я транслирую видео в формате 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:
- Только к исходной конфигурации SPS и PPS.
- К каждому необработанному блоку NAL h264 прямо из кодировщика.
- Для обоих.
Что я делаю не так? Просматривая источник некоторых библиотек RTMP, таких как rtmp-rtsp-stream-client- java, кажется, что при создании тегов FLV сообщение SEI пропадает.
Помощь очень много, очень признателен.