Konversi AVI (Xvid) ke MP4 (H.264) menjaga kualitas yang sama

48

Saya ingin mengkompres file AVI ke MP4 menggunakan codec h.264. Saya tidak bisa mendapatkan kualitas yang sama. Bagaimana saya bisa mengompresnya?

Video Asli:

Layar Video Asli:

Output konsol FFmpeg ( 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

Tes 1

Perintah FFmpeg:

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

Layar Tes 1:

Output konsol 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

Tes 2

Perintah 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

Layar Tes 2:

Output konsol 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
Ahmet KAPIKIRAN
sumber

Jawaban:

60

Pertama-tama, instal versi FFmpeg yang lebih baru - ambil build statis dari halaman unduhan .

Penggunaan vprepreset (yang merupakan cara untuk menetapkan nilai default untuk pengaturan ffmpeg , bukan pengaturan encoder) tidak benar-benar diperlukan; Anda biasanya ingin menggunakan -presetopsi yang ditentukan oleh pembuat enkode.

Alasan Anda mendapatkan kualitas output yang rendah adalah sebagai berikut, untuk dua kasus Anda masing-masing:

  1. Dalam kasus pertama yang Anda gunakan crf 25, Faktor Tingkat Konstan yang akan memberi Anda kualitas yang lebih buruk daripada default untuk enkoder x264 (yang merupakan 23). CRF mengontrol kualitas. Coba atur CRF yang lebih rendah, mungkin 20, 18, dll. Di sini, lebih rendah berarti kualitas yang lebih baik, tetapi itu akan meningkatkan ukuran file. Perubahan 6 dalam CRF memberi Anda dua kali / setengah bitrate rata-rata asli, secara kasar.

    Anda harus menetapkan CRF yang lebih rendah karena kehilangan generasi . Anda sedang menyandikan sesuatu yang sudah disandikan, sehingga Anda sekali lagi membuang informasi visual. Itu tidak pernah baik, tetapi jika harus, Anda harus menetapkan kualitas yang lebih tinggi agar tidak menghapus terlalu banyak informasi dari video input.

  2. Dalam kasus kedua Anda mencoba untuk menetapkan laju bit konstan 2 MBit / s. Video input Anda secara kasar memiliki laju bit yang sama. Sekarang, x264 memberikan kualitas visual yang jauh lebih baik daripada encoder MPEG-4 Visual untuk bitrate yang sama, tetapi karena kehilangan generasi, sekali lagi, Anda mungkin ingin menggunakan bitrate yang bahkan lebih tinggi dari aslinya - jika tidak, Anda akhirnya akan mengompres terlalu banyak informasi.

    Lebih jauh lagi, pengodean bitrate konstan dapat menyebabkan beberapa bagian terlihat bagus, tetapi bagian lain dari video terlihat lebih buruk. Jika Anda tidak membiarkan pembuat kode bebas memilih jumlah bit yang ingin dihabiskan untuk sesuatu, Anda akan mengorbankan kualitas dengan mengorbankan mengetahui ukuran file target.

    x264 memang memiliki mode laju bit konstan, tetapi dianggap lebih rendah daripada metode pengkodean lainnya. Sebenarnya, pengkodean dua jalur tidak dimaksudkan untuk menargetkan kualitas optimal, jadi goreskan itu.

Itu semua dikatakan, cobalah sesuatu di bawah ini:

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

Jika libfdk_aactidak tersedia, gunakan ini sebagai gantinya:

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

Kenop kontrol kualitas utama adalah pengaturan CRF Anda. Percobaan dengan itu dan gunakan nilai yang lebih rendah jika Anda membutuhkan kualitas yang lebih baik.

Anda juga dapat memilih veryslowpreset, yang akan memberi Anda kompresi yang lebih baik, tetapi pengkodeannya jelas akan lebih lama.

Jika Anda tidak dapat mengelola untuk mendapatkan file berkualitas layak pada ukuran file yang masuk akal, maka Anda kurang beruntung. Lebih baik simpan file asli apa adanya, tanpa re-encoding. Tidak ada alat ajaib "menjaga kualitas yang sama" ketika Anda mengompresi sesuatu yang sudah dikompresi.

slhck
sumber
Jika ukuran video Anda lebih kecil setelah konversi dengan dua lintasan, Anda perlu menentukan bitrate yang lebih tinggi. Coba -b:v 3Matau lebih; tapi saya akan merekomendasikan menggunakan metode CRF daripada varian dua-pass.
slhck
10
@AhmetKa Pilihan lain adalah dengan hanya re-mux sungai dari wadah AVI ke MP4 wadah: ffmpeg -i input.avi -c copy -map 0 output.mp4. Tidak ada pengkodean ulang sehingga tidak ada kehilangan kualitas.
Logan
1
@AhmetKa Saya seharusnya menyebutkan bahwa muxing tidak akan selalu berfungsi jika format wadah keluaran tidak mendukung format media dari input. Lihat Perbandingan format wadah untuk mendapatkan gambaran umum tentang apa yang berfungsi.
Logan
Halo lagi @slhck Crf tidak benar. Kecepatan bit, lebar, tinggi, dll. Dapatkah saya menghitung?
Ahmet KAPIKIRAN
3
@hyde Anda harus memilih -c:a aac -strict experimentalbukan libvo_aacenc, karena memberikan kualitas yang lebih baik.
slhck