【问题标题】:How can I mux (or encapsulate) H.264 RTP output into a container using FFMPEG?如何使用 FFMPEG 将 H.264 RTP 输出复用(或封装)到容器中?
【发布时间】:2013-08-11 21:38:26
【问题描述】:

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

我使用联合模型 (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

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

【问题讨论】:

  • 如果我没记错的话,您将“多路复用”与“编码”混淆了。如果您的数据是 YUV,那么它是“解码的”或“原始的”。如果要压缩它,则需要“对其进行编码”。如果您想要高质量/低比特率,请选择 h264(-vcodec h264 我相信)编码器。
  • 不,我对这些条款并不感到困惑。我已经使用 JM 对我的视频进行了编码,并以 RTP 数据包模式而不是 AnnexB 模式获取输出。在获得“编码”双流后,我需要对它们进行解码以便向受试者展示。但是,我不想解码并获得 GB 的 YUV(原始)视频。相反,我想将这些比特流混合到 AVI(或 MP4,容器无关紧要)中,以便以更小的尺寸存储视频数据。这样视频就可以放在某个服务器中,我可以将“主题”(或观众/选民)引导到该网页。这是最简单的众包方式。所以我需要复用:)

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


【解决方案1】:

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

【讨论】:

  • 出于我的目的,视频应该在目的地被解码(即全分辨率)或可解码。需要复用(或封装)编码 RTP 数据包,以避免传输原始 YUV 数据。我已经可以对视频进行编码,并且我知道容器是什么。在没有 JM 的情况下,RTP 分组形式(不是具有 0x001 NALU 报头的 AnnexB 形式)的编码 H.264 比特流在接收端无法解码。但是,使用正确的标头(或容器),大多数视频播放器都能够解码比特流。我改变了问题以更好地解释自己。请检查。
  • 如果我理解正确,你有 h264 非附件 B 封装在这个只有 JM 可以解码的特殊 rtp 东西中,你正在寻找剥离 rtp,并将 h264 放入其他东西中可以很容易地解复用然后解码。基于 iso 的容器(mp4、frv)经常与非附件 B 一起使用,但问题是如果没有附件 B,则编码器不知道通常在附件 B,RTP 标头中有额外的数据吗? ffmpeg 可能不知道怎么处理它们,你可以手动创建数据吗?
  • 是的,这是我的问题。 ffmpeg 一般从给定数据的头部获取参数。即使假设没有 RTP 数据包的标头,ffmpeg 也可以轻松地从输入参数中获取这些标头。唉,我需要那个 ffmpeg 命令,因为我在网上找不到它。我不明白你的问题“......,你能手动创建数据吗?”如果问题是我是否知道分辨率、结构等,我可以将这些信息提供给 ffmpeg。如果问题是手动创建 encoded 比特流数据,我显然不能。 :)
  • 我对 JM 了解不多,但是你能不能用 AnnexB 格式和 RTP 输出相同的电影,然后再将 Annex B 标头与流重新结合?
  • 这可能是个好主意,但也可能很难找到哪个 RTP 丢包对应哪个 AnnexB 切片。我的主要目标是找到一个 ffmpeg 命令来简化我的工作。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 2013-03-24
  • 1970-01-01
  • 2015-07-19
  • 2012-04-25
  • 2011-04-27
  • 2011-10-05
相关资源
最近更新 更多