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

Converteer AVI (Xvid) naar MP4 (H.264) met behoud van dezelfde kwaliteit

Ik wil een AVI bestand comprimeren naar MP4 met een h.264 codec. Ik krijg niet dezelfde kwaliteit. Hoe kan ik het comprimeren?

Original Video:

Origineel videoscherm:

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

FFmpeg commando:

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 Scherm:

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

FFmpeg commando:

Test 2 Scherm:

FFmpeg console-uitvoer (ffmpeg -i 2.mp4)

Antwoorden (1)

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

Installeer om te beginnen een recentere versie van FFmpeg - pak een statische build van de download pagina .

Het gebruik van vpre presets (dat is een manier om standaardwaarden in te stellen voor ffmpeg instellingen, niet voor encoder-instellingen) is niet echt nodig; u wilt meestal de -preset opties gebruiken die door de encoders worden gedefinieerd.

De redenen dat u lage uitvoerkwaliteit krijgt zijn de volgende, voor uw twee gevallen respectievelijk:

  1. In het eerste geval gebruikt u crf 25, een Constant Rate Factor die u een slechtere kwaliteit zal geven dan de standaard voor de x264 encoder (die 23 is). De CRF bepaalt de kwaliteit. Probeer een lagere CRF in te stellen, misschien 20, 18, enz. Hier betekent lager betere kwaliteit, maar het zal de bestandsgrootte vergroten. Een verandering van 6 in de CRF geeft je tweemaal de helft van de oorspronkelijke gemiddelde bitrate, ruwweg.

  2. In het tweede geval probeert u een constante bitsnelheid van 2 MBit/s in te stellen. Je input video heeft ruwweg dezelfde bit rate. Nu levert x264 een veel betere visuele kwaliteit dan een MPEG-4 Visual encoder voor dezelfde bitrate, maar vanwege het generatieverlies zou je opnieuw een nog hogere bitrate willen gebruiken dan het origineel - anders comprimeer je uiteindelijk te veel informatie weg.

Dat alles gezegd hebbende, probeer iets van het volgende:

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

Als libfdk_aac niet beschikbaar is, gebruik dan dit:

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

De belangrijkste knop voor kwaliteitscontrole is de CRF-instelling. Experimenteer daarmee en gebruik een lagere waarde als je betere kwaliteit nodig hebt.

Je kunt ook de veryslow voorinstelling kiezen, waarmee je een betere compressie krijgt, maar het encoderen duurt dan uiteraard langer.

Als je er niet in slaagt om een bestand van fatsoenlijke kwaliteit te krijgen met een redelijke bestandsgrootte, dan heb je pech. Het is beter om het originele bestand te houden zoals het is, zonder opnieuw te coderen. Er is geen magisch hulpmiddel om “dezelfde kwaliteit te behouden” als je iets comprimeert dat al gecomprimeerd is.