如何使用FFMPEG将H.264 RTP输出复用(或封装)到容器中?

时间:2013-08-09 20:49:21

标签: ffmpeg h.264 video-processing rtp video-codecs

我正在研究网络丢失对视频传输的影响。为了模拟网络损耗,我使用了一个简单的程序,它从H.264 RTP编码的输出中丢弃随机RTP数据包。

我使用Joint Model(JM)14.2来编码视频。但是,我不使用AnnexB格式作为输出,而是选择输出作为RTP数据包。 JM输出生成为RTP数据包,其中RTP头和有效负载作为序列。之后,使用一个简单的程序丢弃一些RTP数据包。然后,我可以通过使用JM和它的错误隐藏方法来解码输出比特流。

此过程的主要目的是评估网络损耗对人类视频质量感知产生的差异。为了测量感知质量,所示视频必须是其解码形式(即全分辨率),或者它可以在接收器侧解码。如果没有安装JM软件,JM编码器创建的RTP数据包将无法解码。但是,使用适当的标题(或容器),大多数视频播放器都能够解码比特流。因此,我在这个问题中的目标是将我的编码 RTP数据包比特流封装在一个公共容器(如AVI或MP4)中,以使我的内容可以在接收方计算机上解码。

RTP打包形式的编码比特流的格式如下:

     ----------------------------------------------------------------------
     | RTP Header #1 | RTP Payload #1 | RTP Header #2 | RTP Payload #2 |...
     ----------------------------------------------------------------------

为了找到视频质量,我想用这些比特流进行主观测试。我可以通过使用我自己解码的全分辨率数据进行这些测试,而用互联网上的GB视频数据众显这个主观测试是非常不方便的。因此,我想通过使用FFMPEG将这些比特流复用到容器(即AVI)中。我试图用FFMPEG和FFPLAY解码这些比特流;但是,他们俩都没有用。我也尝试了以下命令,它也没有用。

    ffmpeg - f h264 -i <raw_rtpDropped.264> -vcodec copy -r 25 out.avi

我应该使用哪种格式或多路复用器?我是否需要将这些文件转换为任何其他格式?

1 个答案:

答案 0 :(得分:0)

我想我会再次说服你: 编码是一种获取原始视频并对其进行压缩的方法。这样可以减小视频的大小,这也是您想要的,也会降低质量(您无法获得任何东西)。 多路复用是许多科学中使用的术语,它意味着将两个或多个数据流转换为1.当您复用视频时,通常意味着您采用编码视频并添加音频,或者仅将视频放入容器中例如mpeg2 transport或基于mpeg4 ISO的容器。 AVI也是视频的容器/多路复用(因此称为音频视频交错),因此它无法解决GB数据的问题。 来自维基百科:“AVI文件几乎可以在任何压缩方案中携带音频/视频数据,包括全帧(未压缩),英特尔实时(Indeo),Cinepak,Motion JPEG,可编辑MPEG,VDOWave,ClearVideo / RealVideo, QPEG和MPEG-4视频。“