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

Convertire AVI (Xvid) in MP4 (H.264) mantenendo la stessa qualità

Voglio comprimere un file AVI in MP4 usando un codec h.264. Non ho potuto ottenere la stessa qualità. Come posso comprimerlo?

Video originale:

Schermo video originale:

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 console output (ffmpeg -i input.avi):

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

Test 1

comando FFmpeg:

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 uscita console (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

Test 2

comando FFmpeg:

Test 2 Screen:

uscita console FFmpeg (ffmpeg -i 2.mp4)

Risposte (1)

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

Prima di tutto, installa una versione più recente di FFmpeg - prendi una build statica da la pagina di download .

L'uso dei preset vpre (che è un modo per impostare valori di default per le impostazioni di ffmpeg, non per quelle dell'encoder) non è realmente necessario; di solito vuoi usare le opzioni -preset definite dagli encoder.

Le ragioni per cui ottieni una bassa qualità in uscita sono le seguenti, rispettivamente per i tuoi due casi:

  1. Nel primo caso usi crf 25, un Constant Rate Factor che ti darà una qualità peggiore di quella predefinita per l'encoder x264 (che è 23). Il CRF controlla la qualità. Prova a impostare un CRF più basso, forse 20, 18, ecc. Qui, più basso significa migliore qualità, ma aumenterà la dimensione del file. Un cambiamento di 6 nel CRF ti dà il doppio/metà del bitrate medio originale, più o meno.

  2. Nel secondo caso stai cercando di impostare un bitrate costante di 2 MBit/s. Il tuo video in ingresso ha più o meno lo stesso bitrate. Ora, x264 offre una qualità visiva molto migliore di un codificatore MPEG-4 Visual per lo stesso bitrate, ma a causa della perdita di generazione, di nuovo, potresti voler usare un bitrate ancora più alto dell'originale - altrimenti finirai per comprimere troppe informazioni.

Detto questo, prova qualcosa del genere:

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 non è disponibile, usa invece questo:

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

La manopola principale per il controllo della qualità sarà la tua impostazione CRF. Sperimenta con questa e usa un valore più basso se hai bisogno di una qualità migliore.

Puoi anche scegliere il preset veryslow, che ti darà una migliore compressione, ma la codifica richiederà ovviamente più tempo.

Se non riesci ad ottenere un file di qualità decente ad una dimensione ragionevole, allora sei sfortunato. Meglio mantenere il file originale così com'è, senza ricodificare. Non c'è uno strumento magico per “mantenere la stessa qualità” quando si comprime qualcosa che è già compresso.