如何将 mpeg2 转换为可流式传输或碎片化的 mp4?

如何将 mpeg2 转换为可流式传输或碎片化的 mp4?

我正在尝试将 mythtv 录制的 mpg (mpeg2) 文件转换为可流式传输mp4 文件。转换为 mp4 很简单,但是,必须先转换整个文件才能使用。即使使用将“mov atom”放在文件开头以进行快速流式传输的转换工具,也需要先对整个 mp4 进行编码。

我在 avconv 文档中读到“mov/mp4/ismv 复用器支持碎片化。”它可以在文件开头放置一个“假”mov 原子,然后在整个文件的每个关键帧处放置一个新的 mov 原子,以便在转码时或转换中断时可以对视频进行流式传输。

我相信我已经遵循了 avconv 说明(http://libav.org/avconv.html#MOV_002fMP4_002fISMV) 来了解如何转换文件,但仍然收到错误,表明编码器不理解参数。下面是我的命令,以及它生成的错误输出。我已经用尽谷歌和我自己来寻找答案,但一无所获,所以任何帮助都将不胜感激。

系统运行 ubuntu 12.04x64,avconv 版本为 0.8.1-4:0.8.1-0ubuntu1。

命令:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -c:a copy output.mp4

错误:

[mp4 muxer @ 0x36772e0] [Eval @ 0x7fffeddb69b0] Undefined constant or missing '(' in 'frag_keyframe'
[mp4 muxer @ 0x36772e0] Unable to parse option value "frag_keyframe+empty_moov"
[mp4 muxer @ 0x36772e0] Error setting option movflags to value frag_keyframe+empty_moov.
Output #0, mp4, to 'output.mp4':
    Stream #0.0: Video: libx264, yuv420p, 1920x1080 [PAR 1:1 DAR 16:9], q=-1--1, 90k tbn, 29.97 tbc
    Stream #0.1(eng): Audio: ac3, 48000 Hz, 5.1, 384 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (mpeg2video -> libx264)
  Stream #0:1 -> #0:1 (copy)
Could not write header for output file #0 (incorrect codec parameters ?)

我尝试了不同的多路复用器(-f 参数,如 h264 等),并且遇到了其他错误,例如 movflag 甚至不受支持(逻辑)。

我是否缺少软件包、依赖项,或者只是缺少要点?提前致谢。

答案1

有一个漏洞向 libav 提交了关于此问题的反馈。令人沮丧的是,这个问题似乎没有得到解决。我认为最好将 avconv 视为一个好的编码工具,而不是一个好的封装工具。

最好的方法是使用 MP4Box亚太地区政策咨询委员会。它似乎主要关注将媒体流封装到 mp4 文件中。例如,它不执​​行编码/解码/转码。如果您在 Ubuntu 上安装 GPAC,您可以说:

MP4Box -add non-streamable.mp4 new-shiny-streamable.mp4

MP4Box 默认使 mp4 文件可流式传输:

从 0.2.4 版本开始,MP4Box 总是以 0.5 秒的交错和元数据在开头存储文件,使其适合 HTTP 流式传输。(来源

答案2

这里:它是 ffmpeg 指南,但它同样适用于 avconv。

我不知道如何创建流式传输文件,但错误可能是因为您错过了预设,也可能是质量设置(尽管我相信如果没有提供其他质量设置,avconv 使用 -crf 23 作为默认值)。尝试:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -preset medium -c:a copy output.mp4

预设包括:超快、超快、非常快、更快、快、中、慢、慢和非常慢。较快的预设将提供较快的编码速度,但文件较大,而较慢的预设提供较小的文件,但制作时间较长。不同预设之间没有质量差异。还有一个“安慰剂”预设,但那是 x264 开发人员开的玩笑,应该忽略。

如果这不起作用,你可以尝试使用:

avconv -i 1081_20111227200000.mpg -f mp4 -movflags frag_keyframe+empty_moov -c:v libx264 -crf 20 -preset medium -c:a copy output.mp4

20 完全是任意的,选择最适合您的 crf 设置。越低=图片质量越好,但文件大小越大。根据该指南,您应该使用 18-28 之间的值。

相关内容