【问题标题】:Changing container using FFMPEG produces NAL unit error使用 FFMPEG 更改容器会产生 NAL 单元错误
【发布时间】:2015-04-28 22:46:54
【问题描述】:

背景:

我当前的视频文件放在基于 Linux 的系统中,该系统将内容 (RTP) 流式传输给其他用户。更改后我正在拍摄并将内容发送到服务器并确保编码正确我偶然发现了问题。

我已尝试使用ffmpeg 执行此操作,但是我注入此文件的系统无法识别它并将其流式传输到另一台设备。

我在 Windows 系统上做所有的转码等等

C:\Users\mazdak\Documents\Projects\ffmpeg\bin>ffmpeg -y -i input.mp4 -pix_fmt yuv420p -c:v libx264 -profile:v main -level:v 4.1 -color_range 0 -colorspace bt709 -x264opts colorprim=bt709:transfer=bt709:bframes=1 -an output.mkv

错误: 我得到的是

    StreamMedia exception ry: Unexpected NAL unit type: 9
    (...)
    StreamMedia exception ry: First media frame must be sync point

也许我没有为 RTSP 做准备?是不是这个问题。因为我看到的是能够流式传输的文件是使用 Gstreamer

编码的

所以我想..也许ffmpeg 不这样做?好吧,让我们试试gst-launch。 我需要有关如何处理此问题的指示。

我有什么:

  • GStreamer 的OSSBuild
  • ffmpeg utils
  • input.mp4 - H264 主配置文件 L3.1 - 像素格式 yuvj420p
  • 容器中的音频

我需要什么(可能):

  • output.mkv- H264 主要配置文件 L4.1 - 像素格式 yuv420p - 准备好 RTP(rtph264pay 模块)

  • 已删除音频

我拍摄的两部电影都有h264_analyze 输出。来自成功流式传输的电影,以及我尝试使用ffmpeg的电影

【问题讨论】:

  • 您使用什么系统来传输内容?它在其文档中说明了它可以处理哪些文件格式?
  • @mpr 该系统是在基于 Linux 的操作系统上运行的流媒体服务器。它可以处理的唯一格式是带有 h264 编码内容的 matroska 容器。
  • 所以想要的输出是一个 mkv。您的输入是 mp4 还是其他 mkv?我在您的描述和示例代码中看到了相互矛盾的信息。如果您要做的只是将 mp4 转换为 mkv,那是 GStreamer 可以做的事情,但是管道会根据您是否要添加音轨以及可能的其他一些因素而有所不同。您是在 Windows 中还是在 Linux 中进行转换?另外,是什么创建了输入视频?如果 ffmpeg 无法处理它可能是问题所在。请注意,RTP/RTSP 实际上只处理流方面的事情。不影响 mp4/mkv 文件的正确性。
  • @mpr 对不起!我更改名称时不小心更改了格式。对其进行了更改并在问题中添加了更多信息,这些信息应涵盖您在 cmets 中的问题。我正在尝试将格式从 .mp4 更改为 .mkv。使用为 Windows 构建的 ffmpeg 和 gstreamer 运行 Windows 7。数码相机产生带有音频的“input.mp4”。我不想要“output.mkv”中的音频。

标签: ffmpeg gstreamer h.264 rtp mkv


【解决方案1】:

所以这个问题可以根据你想要做的事情有很多不同的方向。这是一个非常基本的管道,它只是将 mp4 文件中的 h264 视频数据重新复用到 mkv 文件中。它忽略了音频。无需重新编码。

gst-launch-0.10 filesrc location="bbb.mp4" ! qtdemux !视频/x-h264 ! h264解析! matroskamux !文件接收位置=/tmp/bbb.mkv

这是另一个管道,它对 mp4 文件进行解复用,使用开箱即用的 x264 设置对其重新编码,然后将其重新复用到 mkv 文件中。

gst-launch-0.10 filesrc location="bbb.mp4" !解码bin2! 视频转换! x264enc ! h264解析! matroskamux !文件接收器 位置=/tmp/bbb2.mkv

视频格式通常更像是一组数据,而不是单个文件。在顶层,您拥有容器格式(mp4、mkv 等),然后通常在这些容器中,您拥有以各种格式(h264 视频、AAC 音频等)存储的视频和音频数据。然后在流媒体级别,您可以使用诸如 RTP(RTSP 是一种用于协商一个或多个 RTP 流的包装协议)和 MPEGTS 之类的协议。

您可能还想仔细检查您的相机正在拍摄什么。你可以在上面运行ffprobe:

ffprobewhat.mp4

您还可以尝试从头开始创建简单的测试视频,看看 GStreamer 是否可以制作您的服务器可以理解的任何内容。

gst-launch-0.10 videotestsrc num-buffers=120 ! ffmpeg色彩空间! x264enc 配置文件=主要! h264解析! matroskamux !文件接收位置=/tmp/main.mkv

gst-launch-0.10 videotestsrc num-buffers=120 ! ffmpeg色彩空间! x264enc 配置文件=基线! h264解析! matroskamux !文件接收位置=/tmp/baseline.mkv

gst-launch-0.10 videotestsrc num-buffers=120 ! ffmpeg色彩空间! x264enc 配置文件=高! h264解析! matroskamux !文件接收位置=/tmp/high.mkv

【讨论】:

  • 似乎是一个很棒的管道,感谢您的解释。虽然仍然收到错误=/
  • 您运行的是 GStreamer 0.10 还是 1.0?您使用的视频服务器软件的名称是什么?
【解决方案2】:

我的猜测是 input.mp4 包含类型 9 的 NAL(正如错误消息指出的那样)。 “访问单元分隔符”(NAL 类型 9)不应出现在 mp4 中。

在我看来,您的相机正在将非法的 h.264 比特流格式混合到 input.mp4 中。

MP4 应包含以大小为前缀的 NAL,不得包含 SPS(类型 7)、PPS(类型 8)或 AU(类型 9)。

现在的问题是如何过滤掉 AU 或者只是让它们通过。

我会尝试流复制 - 删除音频 - 请参阅:https://ffmpeg.org/ffmpeg.html#Stream-copy

【讨论】:

  • 我会试试看的!
猜你喜欢
  • 2011-08-29
  • 2020-08-25
  • 2019-08-08
  • 2022-12-04
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多