如何在符合RFC3984的RTP中对H264数据包进行分段

时间:2011-04-01 10:49:47

标签: video sip h.264 rtp rfc

我有FFMPEG流媒体基线h264视频,我必须将其封装在RTP中并发送到SIP电话进行解码。我正在使用Linphone和Windows和Mirial的h264插件进行解码。但是,有时我会从FFMPEG获得一个巨大的帧大小(3Kb~9Kb),这显然不适合MTU。

如果我“按原样”发送这些帧并信任IP分段功能,某些手机能够很好地播放,但其他手机会阻塞并无法解码流。我认为这是因为流不符合RFC 3984,它规定不适合MTU的数据包必须分成不同的NALU,并使用RTP的Mark功能标记帧的结尾。

我怎么知道在哪里可以“切割”I或P帧?我注意到碎片化的h264数据包(没有Mark标签的数据包)有时会在0xF8中完成,但无法完全获得模式,并且在描述如何通过RTP发送这些数据包的RFC 3984中没有指定如何执行此操作。

更新:有谁知道如何告诉X264库如何生成最大尺寸的NALU?这样我应该能够避免这个问题。谢谢大家

2 个答案:

答案 0 :(得分:13)

作为RFC 3984bis(作为RFC 6184)的作者,它详细说明了如何将H.264 NAL转换为RFC 3984数据包。有3种模式:0(单NAL),1(允许分段和组合NAL)和2(允许您对传输顺序进行分段,组合和交错,以改变突发丢失将如何影响流,等等)。请参阅SDP打包模式。只需要模式0。

模式0(单NAL)要求您使用UDP分段(不鼓励)或告诉编码器不生成大于MTU-X的NAL。你能够告诉编码器。

模式1可让您分段。有关如何设置FU-A数据包的信息,请参阅RFC。碎片信息在前面。您还可以使用STAP来聚合小型NAL,例如在IDR之前发送的SPS和PPS数据包(通常)。每个数据包都需要正常的RTP标头,序列号递增(但时间戳相同)。

预期帧的最后一个RTP数据包(不是片段或NAL)上的标记,但你不应指望它。

答案 1 :(得分:5)

在x264中,我相信x264_param_t中的int i_slice_max_size可用于控制大小。看看x264.h我不记得我在哪里读过这个,但帖子说这个结构成员可以用来控制NAL大小,但我自己没试过。

int i_slice_max_size; / *每个切片的最大大小(字节);包括估计的NAL开销。 * /

编辑:我找到了源

http://mailman.videolan.org/pipermail/x264-devel/2011-February/008263.html