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

如何使用FFMPEG将H.264 RTP输出多路复用(或封装)到容器中?,ffmpeg,h.264,video-processing,rtp,video-codecs,Ffmpeg,H.264,Video Processing,Rtp,Video Codecs,我正在研究视频传输中网络丢失的影响。为了模拟网络丢失,我使用了一个简单的程序,从H.264 RTP编码的输出中丢弃随机RTP数据包 我使用Joint Model(JM)14.2对视频进行编码。但是,我不使用AnnexB格式作为输出,而是选择作为RTP数据包的输出。JM输出生成为RTP数据包,RTP头和有效负载作为序列。之后,使用一个简单的程序丢弃一些RTP数据包。然后,我还可以使用JM及其错误隐藏方法对输出比特流进行解码 此过程的主要目的是评估网络丢失对人类视频质量感知造成的差异。为了测量感知质

我正在研究视频传输中网络丢失的影响。为了模拟网络丢失,我使用了一个简单的程序,从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 |...
     ----------------------------------------------------------------------
为了找到视频质量,我想对这些比特流进行主观测试。我可以使用自己解码的全分辨率数据进行这些测试,但是在互联网上用GBs视频数据众包这种主观测试是非常不方便的。因此,我想使用FFMPEG将这些比特流多路复用到一个容器(即AVI)中。我尝试用FFMPEG和FFPLAY解码这些比特流;然而,这两种方法都不起作用。我还尝试了以下命令,但也没有成功

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

我应该使用哪种格式或muxer?我需要将这些文件转换为其他格式吗?

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

如果我没有弄错的话,您已经将“多路复用”与“编码”混淆了。如果您的数据是YUV,则它是“解码”或“原始”。如果你想压缩它,那么你需要“编码它”。如果你想要高质量/低比特率,那么就选择h264(-vcodec h264 I beleive)编码器。不,我对这些术语并不感到困惑。我已经使用JM对视频进行了编码,并以RTP数据包模式(而不是AnnexB模式)获得输出。在我得到我的“编码”双流之后,我需要对它们进行解码,以便向被摄对象显示。但是,我不想解码并获取YUV(原始)视频的GBs。相反,我想将这些比特流多路复用到AVI(或MP4,容器并不重要)中,以便以更小的大小存储视频数据。这样,视频就可以放在某个服务器上,我可以将“主题”(或观众/选民)引导到该网页上。这是众包最简单的方式。所以我需要muxing:)出于我的目的,视频应该在目的地解码(即全分辨率)或解码。需要对编码的RTP数据包进行复用(或封装),以避免原始YUV数据的传输。我已经可以对视频进行编码了,我知道什么是容器。RTP打包形式的编码H.264比特流(不是具有0x001 NALU头的附录B形式)在没有JM的情况下无法在接收方解码。然而,通过适当的头(或容器),大多数视频播放器能够解码比特流。为了更好地解释自己,我改变了问题。请检查。如果我理解正确,您将h264非附件B封装在只有JM可以解码的特殊rtp中,您希望剥离rtp,并将h264放入其他可以轻松解组然后解码的东西中。基于iso的容器(mp4、frv)经常与非附录B一起使用,但问题是,如果没有附录B,则编码器不知道通常在附录B中的流参数(分辨率、图片结构等),RTP标头中是否有额外数据?ffmpeg可能不知道如何使用它们,您可以手动创建数据吗?是的,这是我的问题。Ffmpeg通常从给定数据的头部获取参数。即使假设没有RTP数据包的报头,ffmpeg也可以轻松地从输入参数中获取这些数据包。唉,我需要那个ffmpeg命令,因为我在网上找不到它。我不明白你问题的部分“……你能手动创建数据吗?”如果问题是我是否知道分辨率、结构等,我可以向ffmpeg提供这些信息。如果问题是手动创建编码的比特流数据,我显然不能我对JM了解不多,但您能否使用AnnexB格式以及RTP输出相同的电影,然后稍后将AnnexB头与流重新结合?这可能是一个好主意,但也可能很难找到哪个RTP数据包丢失对应于哪个AnnexB片。我的主要目标是找到一个ffmpeg com