将AVI(Xvid)转换为保持相同质量的MP4(H.264)


47

我想使用h.264编解码器将AVI文件压缩为MP4。我无法获得相同的质量。如何压缩?

原始影片:

原始视频屏幕:

FFmpeg控制台输出(ffmpeg -i input.avi):

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree                                                                                         --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopenc                                                                                        ore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libop                                                                                        enjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264                                                                                         --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
[mpeg4 @ 0x626b50] Invalid and inefficient vfw-avi packed B frames detected
Input #0, avi, from 'input.avi':
  Metadata:
    encoder         : VirtualDubMod 1.5.10.2 (build 2542/release)
  Duration: 01:32:38.13, start: 0.000000, bitrate: 2094 kb/s
    Stream #0.0: Video: mpeg4, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 23.98 tbr,                                                                                         23.98 tbn, 23.98 tbc
    Stream #0.1: Audio: ac3, 44100 Hz, 5.1, s16, 384 kb/s
At least one output file must be specified

测试1

FFmpeg命令:

ffmpeg -i input.avi -vcodec libx264 -vpre lossless_slow -crf 25 -acodec libfaac -threads 0 -t 60 1.mp4

测试1屏幕:

FFmpeg控制台输出(ffmpeg -i 1.mp4

    FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 618 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 437 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, 5.1, s16, 176 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

测试2

FFmpeg命令:

ffmpeg -y -i input.avi -pass 1 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -f mp4 -an -y /dev/null
ffmpeg -y -i input.avi -pass 2 -vcodec libx264 -vpre slow -b 2000k -threads 0 -t 60 -acodec libfaac -ab 128k -ac 2 2.mp4

测试2屏幕:

FFmpeg控制台输出(ffmpeg -i 2.mp4

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Dec 28 2012 10:03:40 with gcc 4.4.6 20120305 (Red Hat 4.4.6-4)
  configuration: --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-pthreads --enable-x11grab --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libdc1394 --enable-libfaac --enable-libmp3lame --enable-libopenjpeg --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libx264 --enable-libxvid --enable-zlib --enable-filter=drawtext
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 1970-01-01 00:00:00
    encoder         : Lavf52.93.0
  Duration: 00:01:00.01, start: 0.000000, bitrate: 1097 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 720x304 [PAR 1:1 DAR 45:19], 1028 kb/s, 23.98 fps, 23.98 tbr, 24k tbn, 47.95 tbc
    Metadata:
      creation_time   : 1970-01-01 00:00:00
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16, 63 kb/s
    Metadata:
      creation_time   : 1970-01-01 00:00:00
At least one output file must be specified

Answers:


60

首先,安装FFmpeg的最新版本–从下载页面获取静态版本。

确实没有必要使用vpre预设(这是为ffmpeg设置而不是编码器设置设置默认值的一种方式)。您通常要使用-preset编码器定义的选项。

以下两种情况分别导致输出质量低的原因:

  1. 在第一种情况下,您使用crf 25恒定速率因子会给您比x264编码器默认值(23)更差的质量。CRF控制质量。尝试设置较低的CRF,例如20、18等。此处,较低的CRF意味着质量更好,但会增加文件大小。粗略地说,CRF更改为6可使您获得原始平均比特率的两倍/一半。

    由于世代损耗,您必须设置较低的CRF 。您正在对已经编码的东西进行编码,因此您将再次丢弃视觉信息。这永远都不是一件好事,但是如果有必要,您将不得不设置更高的质量,以免从输入视频中删除过多的信息。

  2. 在第二种情况下,您尝试将恒定比特率设置为2 MBit / s。您输入的视频的比特率大致相同。现在,对于相同的比特率,x264的视觉质量要比MPEG-4视觉编码器好得多,但是由于世代的损失,您可能仍想使用比原始比特率更高的比特率–否则最终将被压缩掉太多的信息。

    此外,恒定的比特率编码可能会导致某些段落看起来不错,但视频的其他部分看上去更糟。如果您不让编码器自由选择要花费在某物上的位数,那么您将牺牲质量,但会牺牲目标文件的大小。

    x264确实具有恒定比特率模式,但被认为不如其他编码方法。实际上,两次通过编码并不是要以最佳质量为目标,因此请从头开始。

话虽如此,请尝试以下方法:

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a libfdk_aac -b:a 192k -ac 2 out.mp4

如果libfdk_aac不可用,请改用以下方法:

ffmpeg -i input.avi -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 192k -ac 2 out.mp4

主要的质量控制旋钮将是您的CRF设置。尝试一下,如果需要更高的质量,请使用较低的值。

您还可以选择veryslow预设,这样可以为您提供更好的压缩效果,但是编码显然需要更长的时间。

如果您无法以合理的文件大小获得高质量的文件,那么您就不走运了。更好地保持原始文件不变,而无需重新编码。压缩已压缩的内容时,没有神奇的“保持相同质量”工具。


如果转换两次后您的视频尺寸较小,则需要指定较高的比特率。尝试-b:v 3M更多;但我建议您使用CRF方法而不是两次通过变体。
slhck

10
@AhmetKa另一个选择是简单地将AVI容器中的流重新混合到MP4容器中:ffmpeg -i input.avi -c copy -map 0 output.mp4。没有重新编码,因此没有质量损失。
llogan

1
@AhmetKa我应该提到,如果输出容器格式不支持输入的媒体格式,则混合将不会总是起作用。请参阅容器格式比较,以了解有效的一般概念。
llogan

再次您好,@ slhck Crf不正确。比特率,宽度,高度等。我可以计算吗?
Ahmet KAPIKIRAN 2012年

3
@hyde您应该首选-c:a aac -strict experimental而不是libvo_aacenc,因为它可以提供更好的质量。
slhck
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.