使用 avconv 进行 2 遍编码

使用 avconv 进行 2 遍编码

我不明白为什么多遍编码的视频质量比单遍编码差?

当我这样做时,它是正确的:

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。显然,如果您知道需要它们,请保留它们。

相关内容