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


48

Quero compactar um arquivo AVI para MP4 usando um codec h.264. Não consegui a mesma qualidade. Como posso comprimir?

Vídeo original:

Tela de vídeo original:

Saída do console do 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

Teste 1

Comando FFmpeg:

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

Tela Teste 1:

Saída do console do 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

Teste 2

Comando 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

Tela Teste 2:

Saída do console do 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

Respostas:


60

Primeiro de tudo, instale uma versão mais recente do FFmpeg - pegue uma compilação estática na página de download .

O uso de vprepredefinições (que é uma forma de valores padrão estabelecidos para ffmpeg configurações, definições não codificador) não é realmente necessário; você geralmente deseja usar as -presetopções definidas pelos codificadores.

Os motivos pelos quais você obtém baixa qualidade de saída são os seguintes para seus dois casos, respectivamente:

  1. No primeiro caso crf 25, use um fator de taxa constante que lhe dará uma qualidade pior 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, menor significa melhor qualidade, mas aumentará o tamanho do arquivo. Uma mudança de 6 no CRF fornece duas vezes / metade da taxa de bits média original, grosso modo.

    Você precisará definir um CRF mais baixo devido à perda de geração . Você está codificando algo que já foi codificado, e novamente jogando fora informações visuais. Isso nunca é bom, mas se for necessário, você precisará definir uma qualidade mais alta para não remover muitas informações do vídeo de entrada.

  2. No segundo caso, você está tentando definir uma taxa de bits constante de 2 MBit / s. Seu vídeo de entrada tem aproximadamente a mesma taxa de bits. Agora, o x264 oferece uma qualidade visual muito melhor do que um codificador Visual MPEG-4 para a mesma taxa de bits, mas devido à perda de geração, novamente, você pode querer usar uma taxa de bits ainda mais alta que a original - caso contrário, você acabará se comprimindo muita informação.

    Além disso, a codificação de taxa de bits constante pode resultar em algumas passagens com boa aparência, mas outras partes do vídeo com pior. Se você não permitir que o codificador escolha livremente a quantidade de bits que deseja gastar em algo, sacrificará a qualidade à custa de saber o tamanho do arquivo de destino.

    O x264 possui um modo de taxa de bits constante, mas é considerado inferior aos outros métodos de codificação. Na verdade, a codificação de duas passagens não tem como objetivo atingir a qualidade ideal, portanto, considere isso.

Dito isso, tente algo 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_aacnão estiver disponível, use isto:

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

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

Você também pode escolher a veryslowpredefinição, o que proporcionará uma melhor compactação, mas a codificação obviamente levará mais tempo.

Se você não conseguir obter um arquivo de qualidade decente com um tamanho razoável, estará sem sorte. Melhor manter o arquivo original como está, sem recodificar. Não há mágica em "manter a mesma qualidade" quando você está compactando algo que já está compactado.


Se o tamanho do seu vídeo for menor após a conversão com duas passagens, você precisará especificar uma taxa de bits mais alta. Tente -b:v 3Mou mais; mas eu recomendo usar o método CRF em vez da variante de duas passagens.
slhck

10
@AhmetKa Outra opção é simplesmente re-mux os fluxos de container AVI para recipiente MP4: ffmpeg -i input.avi -c copy -map 0 output.mp4. Não há recodificação, portanto não há perda de qualidade.
Llogan

1
@AhmetKa Eu deveria ter mencionado que o muxing nem sempre funcionará se o formato do contêiner de saída não suportar os formatos de mídia da entrada. Consulte Comparação de formatos de contêiner para obter uma idéia geral do que funciona.
Llogan

Olá novamente @slhck Crf não está corretamente. Taxa de bits, largura, altura, etc. Posso calcular?
Ahmet KAPIKIRAN

3
@hyde Você prefere, em -c:a aac -strict experimentalvez de libvo_aacenc, porque oferece melhor qualidade.
slhck
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.