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

Konwersja AVI (Xvid) do MP4 (H.264) z zachowaniem tej samej jakości

Chcę skompresować plik AVI do MP4 używając kodeka h.264. Nie udało mi się uzyskać tej samej jakości. Jak mogę go skompresować?

Oryginalne wideo:

Oryginalny ekran wideo:

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

Wyjście konsoli FFmpeg (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

Polecenie 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 Ekran:

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

Wyjście konsoli 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 '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

Polecenie FFmpeg:

Test 2 Ekran:

Wyjście konsoli FFmpeg (ffmpeg -i 2.mp4)

.

Odpowiedzi (1)

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

Po pierwsze, zainstaluj nowszą wersję FFmpeg - pobierz statyczny build z strony z plikami do pobrania .

Użycie presetów vpre (które są sposobem na ustawienie wartości domyślnych dla ustawień ffmpeg, nie ustawień kodera) nie jest tak naprawdę konieczne; zazwyczaj chcesz użyć opcji -preset zdefiniowanych przez kodery.

Powody, dla których otrzymujesz niską jakość wyjściową są następujące, odpowiednio dla twoich dwóch przypadków:

  1. W pierwszym przypadku używasz crf 25, a Constant Rate Factor , który da ci gorszą jakość niż domyślna dla kodera x264 (która wynosi 23). CRF kontroluje jakość. Spróbuj ustawić niższy CRF, może 20, 18, itd. Tutaj, niższy oznacza lepszą jakość, ale zwiększy rozmiar pliku. Zmiana o 6 w CRF daje dwa razy/połowę oryginalnego średniego bitrate, mniej więcej.

  2. W drugim przypadku próbujesz ustawić stałą prędkość bitową na poziomie 2 MBit/s. Twoje wideo wejściowe ma mniej więcej taką samą przepływność. Teraz, x264 zapewnia znacznie lepszą jakość wizualną niż koder MPEG-4 Visual dla tego samego bitrate, ale z powodu straty generacji, ponownie, możesz chcieć użyć nawet wyższego bitrate niż oryginał - w przeciwnym razie skończysz kompresując zbyt wiele informacji.

To wszystko, spróbuj czegoś w następujący sposób:

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

Jeśli libfdk_aac nie jest dostępne, użyj tego zamiast tego:

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

Głównym pokrętłem kontroli jakości będzie twoje ustawienie CRF. Poeksperymentuj z tym i użyj niższej wartości, jeśli potrzebujesz lepszej jakości.

Możesz również wybrać ustawienie veryslow, które zapewni ci lepszą kompresję, ale kodowanie będzie oczywiście trwało dłużej.

Jeśli nie uda Ci się uzyskać pliku o przyzwoitej jakości i rozsądnym rozmiarze, to masz pecha. Lepiej zachować oryginalny plik jako taki, bez ponownego kodowania. Nie ma magicznego narzędzia “utrzymywania tej samej jakości”, gdy kompresujesz coś, co jest już skompresowane.