如何使用 FFMPEG 制作最高质量的 MPEG2 视频文件?

Iva*_*van 15 video ffmpeg video-conversion microsoft-powerpoint mpeg2

我有一个 WMV(v9 (WMV3)、960x720、30.000030 fps、平面 4:2:0 YUV,由 PowerPoint 2010 制作)文件,需要将其转换为 MPEG2 - 我的电视机可以从 USB 闪存驱动器读取的唯一格式(我也试过 MP4/h.264、AVI/XVID——除了 MPEG2 什么都没有)。

我设法用简单的方式完成了工作

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"
Run Code Online (Sandbox Code Playgroud)

但是结果的质量很糟糕(引入了清晰可见的视觉失真)并且播放不流畅(有时太慢)。

我也试过

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"
Run Code Online (Sandbox Code Playgroud)

(我在互联网上的某个地方找到了这个并稍作修改 - 改变了分辨率、刷新率和输出格式(从 VOB 到裸 MPG))成功但质量仍然太差。

我必须使用哪些参数来尽可能地保存质量?压缩比根本不重要,即使文件大小增加也是可以接受的。

我真正需要的另一件事(我选择不将其包含在问题标题中以避免使其过于具体,但我希望在答案中考虑它)正在添加纯静音作为音轨 - 没有声音原来的,但电视机抱怨它,我想摆脱这个抱怨。我使用 Audacity 生成了一个相同长度(第二精度)的静音 OGG Vorbis 文件,但我无法将其与视频合并:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg
Run Code Online (Sandbox Code Playgroud)

甚至光秃秃的

ffmpeg -i in.mpg -c:v copy -out.mpg
Run Code Online (Sandbox Code Playgroud)

给出“缓冲区下溢”和“数据包太大”错误。(in.mpg 是使用问题中的前两个命令由相同的 FFMPEG 二进制文件和相同的源 WMV 文件生成的文件)。

我在 Windows 7 上使用 Zeranoe FFMPEG 构建。

slh*_*hck 17

问题是 MPEG-2 的默认比特率相当低(与 ffmpeg 中的大多数其他视频编码器一样,H.264 是一个例外)。如今,MPEG-2 也不是编解码器的最佳选择。

MPEG-2 质量更好

如果您想坚持使用 MPEG-2,您有几个选择:

  • 提高比特率。您现在正在使用-b:v 2500k. 如果是高清视频,仅 2.5 MBit/s 就走不了多远。您至少需要两倍甚至更多才能使结果看起来不错。例如,使用-b:v 6000k -target pal-dvd.

    对于 720p,我认为您仍然应该使用更高的比特率。请记住,DVD 使用 MPEG-2,并且为 2 小时的电影提供大约 4.7 GB 的空间,因此您最终会获得大约 5–8 MBit/s 的速度。MPEG-2 的压缩效率确实不是很高,并且在更高的比特率下效果更好。

  • 使用特定的质量设置。更改-b:v …-qscale:v 2。这里的数字范围从 1 到 31,更高意味着更低的质量。超过 4 或 5 没有任何意义。如果您不关心比特率,请从 2 开始,看看它是否适合您。

B 帧数、运动估计方法或 GOP 大小可能会稍微调整质量,但不会导致大的变化。

静音音频

使用-f lavfi -i aevalsrc=0产生一种无声的音频流。例如:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"
Run Code Online (Sandbox Code Playgroud)

您可能需要添加-target pal-dvd到上述命令以强制特定缓冲区大小。

我选择 MP3 作为编解码器。MPEG 文件不能包含除 MPEG Layer I 和 II 音频以及 PCM 流之外的音频,因此除非您也转换音频流(这不是您在使用时所做的-c:a copy),否则使用无声 Ogg Vorbis 文件将不起作用.

使用不同的视频编解码器

我很惊讶播放视频文件的电视会读取 MPEG-2 而不是其他任何东西。至少应该支持MPEG-4 Part II 视频(这就是您所知的“DivX”——一种 MPEG-4 Part II 编码器)。所以你可以试试:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"
Run Code Online (Sandbox Code Playgroud)

您的电视实际上可能也支持 H.264,但仅支持特定的配置文件。尝试使用baseline配置文件,例如:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我使用 CRF 选项来设置质量而不是qscale. 有关更多信息,请参阅H.264 编码指南