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

40

Eu quero compactar um arquivo AVI para MP4 usando um codec h.264. Eu não conseguia a mesma qualidade. Como posso comprimir?

Vídeo original:

Tela de vídeo original:

SaídadoconsoleFFmpeg(ffmpeg-iinput.avi):

FFmpegversionSVN-r26402,Copyright(c)2000-2011theFFmpegdevelopersbuiltonDec28201210:03:40withgcc4.4.620120305(RedHat4.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=drawtextlibavutil50.36.0/50.36.0libavcore0.16.1/0.16.1libavcodec52.108.0/52.108.0libavformat52.93.0/52.93.0libavdevice52.2.3/52.2.3libavfilter1.74.0/1.74.0libswscale0.12.0/0.12.0[mpeg4@0x626b50]Invalidandinefficientvfw-avipackedBframesdetectedInput#0,avi,from'input.avi':Metadata:encoder:VirtualDubMod1.5.10.2(build2542/release)Duration:01:32:38.13,start:0.000000,bitrate:2094kb/sStream#0.0:Video:mpeg4,yuv420p,720x304[PAR1:1DAR45:19],23.98tbr,23.98tbn,23.98tbcStream#0.1:Audio:ac3,44100Hz,5.1,s16,384kb/sAtleastoneoutputfilemustbespecified

Teste1

ComandoFFmpeg:

ffmpeg-iinput.avi-vcodeclibx264-vprelossless_slow-crf25-acodeclibfaac-threads0-t601.mp4

Testedatela1:

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

Teste da tela 2:

Saída do console 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
    
por Ahmet KAPIKIRAN 28.12.2012 / 15:42

1 resposta

53

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

O uso de vpre presets (que é uma forma de definir valores padrão para as configurações do ffmpeg , não das configurações do codificador) não é realmente necessário; você geralmente deseja usar as opções -preset definidas pelos codificadores.

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

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

    Você terá que definir um CRF mais baixo devido à perda de geração . Você está codificando algo que já estava codificado, então você está novamente jogando fora informações visuais. Isso nunca é bom, mas se for necessário, você terá que 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, 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, você pode querer usar uma taxa de bits ainda maior que a original - caso contrário, você acabará 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 parecem piores. Se você não permitir que o codificador escolha livremente a quantidade de bits que deseja gastar em algo, você sacrificará a qualidade à custa de conhecer o tamanho do arquivo de destino.

    O x264 tem 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, então faça isso.

Isso tudo dito, 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 isso:

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

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

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

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

    
por 28.12.2012 / 15:53