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


16

我有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"

但结果的质量令人恐惧(引入了明显可见的视觉失真),并且播放不流畅(有时过慢)。

我也尝试过

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"

(我已经在Internet上的某个地方找到了此文件,并进行了一些修改-成功更改了组件,刷新率和输出格式(从VOB到裸MPG)),但是质量仍然很差。

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

我实际上需要的另一件事(我选择不将其包含在问题标题中,以避免过于具体,但我希望您在回答中考虑到它)将纯净的静音添加为音轨-声音中没有声音原始,但电视机对此有所抱怨,我想摆脱这种抱怨。我已经使用Audacity生成了一个等长(精确到秒)的静音OGG Vorbis文件,但是我无法将其与视频合并:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

甚至裸露

ffmpeg -i in.mpg -c:v copy -out.mpg

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

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


2
有人会要求您提供完整的输出日志。
dstob

到底是什么电视机?它可能能够读取H.264,只是一个不同的配置文件。
slhck 2014年

@slhck电视机是Philips 42PFL3606H/58,我正在使用H.264进行编码ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"-配置文件是我所知道的最低配置文件,并且甚至进行了更多调整以使播放结果文件更容易。
伊万

1
根据手册,电视支持MPEG-4 Visual和H.264。如果基准资料不起作用,我不确定是什么。但是电视很挑剔。
slhck 2014年

Answers:


16

问题在于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并能提供大约4.7 GB的电影播放2小时时间,因此最终的速度约为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"

您可能需要添加-target pal-dvd到上述命令中,以强制使用一定的缓冲区大小。

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

使用其他视频编解码器

令我惊讶的是,播放视频文件的电视将读取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"

您的电视实际上可能还支持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"

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


“考虑到B帧的数量,运动估计方法或GOP大小可能会稍微调整质量,但不会导致较大的变化。” -我可以将每个帧都设为B帧,并且不对MPEG2使用运动估计吗?该视频包含很多非常动态的部分。
伊万

我尝试了您建议的第一个命令行(ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4")-它编码约100帧,然后开始在屏幕上充斥诸如[mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761和的错误[mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it
伊万

@Ivan您可以使用更改比特率-b:v。将其添加到我的答案。关于编码器设置:不能将每一帧都设为B帧。此外,您还需要运动估计–方法越详尽,压缩效果越好。但是,如果是动态视频,您首先需要的是大幅提高比特率。编码设置确实没有太大影响。至于您的错误,您确定这是正确命令的错误吗?一[mpeg],如果你的输出文件是唯一可能发生的错误.mpg,而不是当它的.mp4
slhck

我复制了=粘贴了错误的部分,@ slhck,我正在使用ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"
伊万2014年

1
-target pal-dvd解决了问题,-bufsize不起作用(我已经尝试过-b:v 7M -bufsize 7M -maxrate 7M)。
伊万

0

我会立即说,如果文件大小真的不重要,那么可以尝试增加比特率。

对于无声音频,您可能只想使用ffmpeg,但我对Audacity的了解还不足以提供任何形式的评论。我以前用过。

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

但是,这对您不起作用,因为您使用的是mpg容器,因此您可能要尝试。(mp3容器)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

它似乎为我工作。


无需设置持续时间,因为ffmpeg只会使用视频所需的任何内容。
slhck 2014年

正如Ivan所做的那样,我将事情保持在两步过程中。如果您在我的命令中忽略了持续时间,那么我不知道ffmpeg将运行多长时间(可能比您想要的时间更长)。
dstob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.