2012-12-28 14:42:59 +0000 2012-12-28 14:42:59 +0000
48
48

Converter AVI (Xvid) em MP4 (H.264) mantendo a mesma qualidade

Quero comprimir um ficheiro AVI para MP4 usando um codec h.264. Não consegui obter a mesma qualidade. Como é que o posso comprimir?

Vídeo original:

Ecrã de Vídeo Original:

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

FFmpeg saída da consola (ffmpeg -i input.avi):

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

Teste 1

FFmpeg comando:

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

Test 1 Screen:

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

FFmpeg saída da consola (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 '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

Teste 2

comando FFmpeg:

Test 2 Screen:

FFmpeg saída da consola (ffmpeg -i 2.mp4)

Respostas (1)

60
60
60
2012-12-28 14:53:52 +0000

Em primeiro lugar, instalar uma versão mais recente do FFmpeg - obter uma compilação estática a partir de a página de download .

A utilização de vpre presets (que é uma forma de definir valores por defeito para ffmpeg settings, não encoder settings) não é realmente necessária; normalmente deseja-se utilizar as opções -preset definidas pelos codificadores.

As razões pelas quais obtém uma baixa qualidade de saída são as seguintes, respectivamente para os seus dois casos:

  1. no primeiro caso usa crf 25, um Fator de Taxa Constante que lhe vai dar pior qualidade do que o padrão para o codificador x264 (que é 23). O CRF controla a qualidade. Tente definir um CRF mais baixo, talvez 20, 18, etc. Aqui, mais baixo significa melhor qualidade, mas vai aumentar o tamanho do ficheiro. Uma alteração de 6 na CRF dá-lhe o dobro/metade da taxa média de bits original, mais ou menos falando.

  2. No segundo caso está a tentar definir uma taxa de bits constante de 2 MBit/s. O seu vídeo de entrada tem, grosso modo, a mesma taxa de bits. Agora, x264 proporciona uma qualidade visual muito melhor do que um codificador visual MPEG-4 para a mesma taxa de bits, mas devido à perda de geração, mais uma vez, poderá querer utilizar uma taxa de bits ainda mais elevada do que a original - caso contrário, acabará por comprimir demasiada informação.

Dito isto, tente algo ao longo do seguinte:

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

Se libfdk_aac não estiver disponível, use isto em vez disso:

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

O principal botão de controlo de qualidade será a sua configuração CRF. Experimente e utilize um valor mais baixo se precisar de melhor qualidade.

Também pode escolher o veryslow predefinido, o que lhe dará uma melhor compressão, mas a codificação levará obviamente mais tempo.

Se não conseguir obter um ficheiro de qualidade decente a um tamanho de ficheiro razoável, então está sem sorte. É melhor manter o ficheiro original tal como está, sem recodificação. Não há nenhuma ferramenta mágica de “manter a mesma qualidade” quando se está a comprimir algo que já está comprimido.