Aynı kaliteyi koruyarak AVI'yi (Xvid) MP4'e (H.264) dönüştürün


46

Bir AVI dosyasını bir h.264 codec bileşeni kullanarak MP4'e sıkıştırmak istiyorum. Aynı kaliteyi alamadım. Nasıl sıkıştırabilirim?

Orijinal Video:

Orijinal Video Ekranı:

FFmpeg konsol çıkışı ( 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

Test 1

FFmpeg komutu:

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

Test 1 Ekranı:

FFmpeg konsol çıkışı ( 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

Test 2

FFmpeg komutu:

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

Test 2 Ekranı:

FFmpeg konsol çıkışı ( 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

Yanıtlar:


59

Her şeyden önce, FFmpeg'in daha yeni bir sürümünü kurun ; indirme sayfasından statik bir yapı elde edin .

Ön vpreayarların kullanımı ( kodlayıcı ayarları için değil, ffmpeg ayarları için varsayılan değerleri ayarlamanın bir yolu ) gerçekten gerekli değildir; genellikle -presetkodlayıcılar tarafından tanımlanan seçenekleri kullanmak istersiniz .

Çıktı kalitesinin düşük olmasının sebepleri sırasıyla iki durumda:

  1. Kullandığınız ilk durumda , x264 kodlayıcı (23 olan) için varsayılandan daha kötü kalite verecek crf 25bir Sabit Hız Faktörü . CRF kaliteyi kontrol eder. Daha düşük bir CRF, belki 20, 18, vb. Ayarlamayı deneyin. Burada, daha düşük kalite daha iyi demektir, ancak dosya boyutunu artırır. CRF’deki 6’lık bir değişiklik, kabaca konuşursak, orijinal ortalama bit hızının iki katı / yarısı verir.

    Üretim kaybı nedeniyle daha düşük bir CRF ayarlamanız gerekecek . Zaten kodlanmış olan bir şeyi kodluyorsunuz, bu yüzden görsel bilgileri yine atıyorsunuz. Bu asla iyi değildir, ancak gerekirse, giriş videosundan çok fazla bilgi çıkarmamak için daha yüksek bir kalite ayarlamak zorunda kalacaksınız.

  2. İkinci durumda, sabit bir 2 MBit / s bit hızı ayarlamaya çalışıyorsunuzdur. Giriş videonuz yaklaşık aynı bit hızına sahip. Şimdi, x264, aynı bit hızı için bir MPEG-4 Görsel kodlayıcısından çok daha iyi bir görsel kalite sunar, ancak yine de, üretim kaybı nedeniyle, orijinalden çok daha yüksek bir bit hızı kullanmak isteyebilirsiniz - aksi takdirde bitmeye başlayabilirsiniz çok fazla bilgi.

    Ayrıca, sabit bit hızı kodlaması bazı bölümlerin iyi görünmesine, ancak videonun diğer bölümlerinin daha kötü görünmesine neden olabilir. Kodlayıcının bir şey için harcamak istediği bit miktarını serbestçe seçmesine izin vermezseniz, hedef dosya boyutunu bilmek pahasına kaliteden ödün vereceksiniz.

    x264'ün sabit bir bit hızı modu vardır, ancak diğer kodlama yöntemlerinden daha düşük olduğu düşünülmektedir. Aslında, iki geçişli kodlamanın optimal kaliteyi hedeflemesi anlamına gelmez, bu yüzden çizik yap.

Hepsi söyleniyor, aşağıdakiler boyunca bir şeyler dene:

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

libfdk_aacMevcut değilse , bunu kullanın:

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

Ana kalite kontrol düğmesi CRF ayarınız olacaktır. Bunu deneyin ve daha iyi kaliteye ihtiyacınız varsa daha düşük bir değer kullanın.

Size veryslowdaha iyi sıkıştırma sağlayacak hazır ayarı da seçebilirsiniz , ancak kodlama açıkça daha uzun sürecektir.

Makul bir dosya boyutunda iyi kalitede bir dosya almayı başaramazsanız, şansınız kalmaz. Yeniden kodlamadan orijinal dosyayı olduğu gibi tutmak daha iyi. Sıkıştırılmış bir şeyi sıkıştırırken sihir yoktur "aynı kaliteyi koruyor" aracı.


Videonuz iki geçişli dönüşümden sonra daha küçükse, daha yüksek bir bit hızı belirtmeniz gerekir. -b:v 3MVeya daha fazlasını deneyin ; ancak iki geçişli değişken yerine CRF yöntemini kullanmanızı tavsiye ederim.
slhck

9
@AhmetKa Başka bir seçenek ise basitçe yeniden mux MP4 kaba AVI kaptan akışları: ffmpeg -i input.avi -c copy -map 0 output.mp4. Yeniden kodlama yoktur, dolayısıyla kalite kaybı olmaz.
lgagan

1
@AhmetKa Çıktı kabı formatı girişin medya formatlarını desteklemiyorsa muxing'in her zaman işe yaramayacağını söylemeliydim. Neyin işe yaradığı hakkında genel bir fikir edinmek için Kapsayıcı biçimlerin karşılaştırılması bölümüne bakın .
lgagan

Merhaba tekrar @slhck Crf düzgün değil. Bit hızı, genişlik, yükseklik vb. Hesaplayabilir miyim?
Ahmet KAPIKIRAN

3
@hyde Bunun -c:a aac -strict experimentalyerine tercih etmelisiniz libvo_aacenc, çünkü daha iyi kalite sunar.
slhck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.