1

背景:

我当前的视频文件放在基于 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 Main profile L4.1 - 像素格式 yuv420p - RTP 准备好(rtph264pay 模块)

  • 已移除音频

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

4

2 回答 2

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:

ffprobe 随便什么.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

于 2015-04-27T14:28:14.120 回答
0

我的猜测是 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

于 2015-04-28T14:46:54.830 回答