我不明白为什么多遍编码的视频质量比单遍编码差?
当我这样做时,它是正确的:
avconv -i video.mpg -s 640x360 -threads auto \
-vcodec libxvid -b 800k -r 24 -g 300 -bf 2 \
-acodec libmp3lame -ac 2 -ab 128k -ar 48000 \
video.avi
这是最糟糕的:
avconv -i video.mpg -s 640x360 -pass 1 -threads auto \
-vcodec libxvid -b 800k -r 24 -f avi -an -y /dev/null
avconv -i video.mpg -s 640x360 -pass 2 -threads auto \
-vcodec libxvid -b 800k -r 24 -g 300 -bf 2 \
-acodec libmp3lame -ac 2 -ab 128k -ar 48000 \
video.avi
我究竟做错了什么?
答案1
如果你得到的质量较差,可能是因为你错误地使用了 -b 标志。它用过的仅指视频比特率,但随着最近 ffmpeg/avconv 语法的全面改革,它现在指的是整体比特率。因此,第一遍告诉 avconv 它有 800kbit/s 可用于播放视频,但第二遍告诉它它有 (800-128)=672kbit/s 可用于工作。
第一次传递所做的就是为第二次传递创建一个路线图,以便利用它 - 这个地方是动作场景,它需要更高的比特率;这是一个缓慢的对话,它需要更少的比特率 - 诸如此类。因为它处理的信息不正确,所以路线图是不正确的。
改用 -b:v(并使用 -b:a 代替 -ab),如下所示:
avconv -y -i video.mpg -s 640x360 -pass 1 -threads auto -c:v libxvid -b:v 672k -r 24 -f avi -an /dev/null
avconv -i video.mpg -s 640x360 -pass 2 -threads auto -c:v libxvid -b:v 672k -r 24 -g 300 -bf 2 -c:a libmp3lame -ac 2 -b:a 128k -ar 48000 video.avi
此外,许多选项可能都是不必要的,因为 avconv 将使用与输入相同的选项。除非您要调整视频大小,否则请省略该-s 640x360
位。同样,除非您需要更改帧速率,否则请省略该位,-r 24
除非您确实需要更改采样率,否则请省略该位-ar 48000
。显然,如果您知道需要它们,请保留它们。