Pie*_*ani 11 video sip rfc rtp h.264
我有FFMPEG流媒体基线h264视频,我必须将其封装在RTP中并发送到SIP电话进行解码.我正在使用Linphone和Windows和Mirial的h264插件进行解码.但是,有时我会从FFMPEG获得一个巨大的帧大小(3Kb~9Kb),这显然不适合MTU.
如果我"按原样"发送这些帧并信任IP分段功能,一些手机能够很好地播放它,但是其他手机扼流并且无法解码流.我认为这是因为流不符合RFC 3984,该RFC 3984规定不适合MTU的数据包必须分成不同的NALU,并使用RTP的Mark功能标记Frame的结尾.
我怎么知道在哪里可以"切割"I或P帧?我注意到碎片化的h264数据包(没有Mark标签的数据包)有时会在0xF8中完成,但无法完全获得模式,并且在描述如何通过RTP发送这些数据包的RFC 3984中没有指定如何执行此操作.
更新:有谁知道如何告诉X264库如何生成最大大小的NALU?这样我应该能够避免这个问题.感谢大家
jes*_*sup 14
作为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)上的标记,但您不应指望它.
在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