RTMP 是否支持 h264 流中的显示方向 SEI 消息?



我正在使用本机MediaCodec API在Android上的RTMP上流式传输视频h264视频和AAC音频。视频和音频看起来很棒,但是当视频以 potrait 模式拍摄时,在网络上或使用 VLC 播放始终是横向的。

通读 h264 规范后,我看到可以在补充增强信息 (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()
}()

使用 Jcodec 的 SEI 类,我可以看到我的 SEI 消息被正确解析。我使用 LibRtmp 的 Android JNI 包装器将这些数据包写到 RTMP 流中。

尽管如此,ffprobe 不会显示方向元数据,并且播放时的视频仍保持横向。

在这一点上,我想我错过了一个关于 LibRtmp 写出原始 h264 单元时 FLV 标头如何工作的非常小的细节。我尝试将这个displayOrientationSEI附加到 NAL 单元:

  1. 仅到初始 SPS 和 PPS 配置。
  2. 每个原始 h264 NAL 单元直接从编码器。
  3. 对两者都有。

我做错了什么?通过一些RTMP库的源代码,如rtmp-rtsp-stream-client-java,似乎在创建FLV标签时SEI消息被丢弃。

非常感谢帮助。

RTMP 是否支持 h264 流中的显示方向 SEI 消息?

从RTMP的角度来看,SEI只是它复制的一系列字节。它从不查看它们,从不解析它们。

需要支持它的是h.264解码器(RTMP也不知道(和播放器软件。如果它不适合您,您必须检查播放器或编码 SEI 的有效性,而不是传输。

最新更新