Bagaimana saya bisa menggunakan FFmpeg untuk menurunkan kualitas video H264 tetapi menyimpannya dalam format H264?

8

Saya noob untuk mengedit video, jadi maafkan saya jika saya meminta sesuatu yang konyol.

Saya mendapatkan klip video dari kotak set top recorder. Klip adalah file AVI:

Resolution: 1920 x 1080
Frames Per Second: 60
Video Format: ITU H.264
Audio Format: MPEG 1 Audio, Layer 3 (MP3)

Resolusi dan FPS jauh melampaui apa yang saya butuhkan, jadi saya mencoba menjalankan perintah untuk memperkecil:

ffmpeg -i highres.avi -r 30 -s 960x540 lowerres.avi

Ini berhasil memberi saya resolusi yang diinginkan, framerate dan ukuran file yang lebih rendah, tetapi juga menurunkan kualitas lebih dari yang saya harapkan.

Saya melihat file baru, dan menemukan bahwa untuk beberapa alasan FFmpeg mengkonversi format yang digunakan:

Video Format: FFmpeg MPEG-4
Audio Format: MPEG 1 Audio, Layer 2

Tidak jelas bagi saya mengapa tidak menggunakan format output yang sama dengan format input. Saya mencoba menggunakan perintah ini untuk memaksanya menggunakan H.264:

ffmpeg -i highres.avi -r 30 -s 960x540 -f h264 lowerresforceh264.avi

Sayangnya, gagal dengan output berikut:

ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers
  built on Jan  4 2012 16:21:50 with gcc 4.6.1
  configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static
  WARNING: library configuration mismatch
  avutil      configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avcodec     configuration: --extra-version='4:0.7.3ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-libopenjpeg --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdirac --enable-libmp3lame --enable-librtmp --enable-libx264 --enable-libxvid --enable-libvo-aacenc --enable-version3 --enable-libvo-amrwbenc --enable-version3 --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avformat    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avdevice    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  avfilter    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  swscale     configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  postproc    configuration: --extra-version='4:0.7.3-0ubuntu0.11.10.1' --arch=i386 --prefix=/usr --enable-vdpau --enable-bzlib --enable-libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --enable-libvpx --enable-runtime-cpudetect --enable-vaapi --enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --shlibdir=/usr/lib/i686/cmov --cpu=i686 --enable-shared --disable-static --disable-ffmpeg --disable-ffplay
  libavutil    51.  7. 0 / 51.  7. 0
  libavcodec   53.  6. 0 / 53.  6. 0
  libavformat  53.  3. 0 / 53.  3. 0
  libavdevice  53.  0. 0 / 53.  0. 0
  libavfilter   2.  4. 0 /  2.  4. 0
  libswscale    2.  0. 0 /  2.  0. 0
  libpostproc  52.  0. 0 / 52.  0. 0
Input #0, avi, from 'highres.avi':
  Metadata:
    comment         : Quality_GOOD
    encoder         : Lavf52.64.2
    encoded_by      : AverMedia_c281_1.7.2
  Duration: 00:01:59.28, start: 0.000000, bitrate: 10263 kb/s
    Stream #0.0: Video: h264 (High), yuv420p, 1920x1080, 59.94 fps, 59.94 tbr, 59.94 tbn, 119.88 tbc
    Stream #0.1: Audio: mp3, 48000 Hz, stereo, s16, 128 kb/s
[buffer @ 0x8f438a0] w:1920 h:1080 pixfmt:yuv420p
[scale @ 0x8f431e0] w:1920 h:1080 fmt:yuv420p -> w:960 h:540 fmt:yuv420p flags:0x4
[libx264 @ 0x8f0fb40] broken ffmpeg default settings detected
[libx264 @ 0x8f0fb40] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x8f0fb40] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x8f0fb40] speed presets are listed in x264 --help
[libx264 @ 0x8f0fb40] profile is optional; x264 defaults to high
Output #0, h264, to 'lowerresforceh264.avi':
    Stream #0.0: Video: libx264, yuv420p, 960x540, q=2-31, 200 kb/s, 90k tbn, 30 tbc
Stream mapping:
  Stream #0.0 -> #0.0
Error while opening encoder for output stream #0.0 - maybe incorrect parameters such as bit_rate, rate, width or height

Saya tidak yakin mengapa saya tidak bisa melakukan ini. Menjalankan "ffmpeg-format" terdaftar h264 sebagai salah satu yang bisa digunakan untuk input dan output.

Jika ada yang bisa mengarahkan saya ke arah yang benar, saya akan sangat menghargainya. Terima kasih.

PS: Saya menggunakan FFmpeg versi 0.7.3-4: 0.7.3-0 di Ubuntu 11.10.

EDIT

Saya telah menemukan solusi melihat penggunaan preset. Setelah mencari informasi tentang preset, saya menemukan tutorial berikut yang membahasnya:

http://juliensimon.blogspot.com/2009/01/howto-ffmpeg-x264-preset.html

Saya hanya perlu menentukan codec dan pengaturan preset yang tepat seperti:

ffmpeg -i highres.avi -r 30 -s 960x540 -vcodec libx264 -vpre medium lowerresforceh264vpremedium.avi

Saya masih memiliki beberapa penyesuaian yang harus dilakukan, tetapi pada dasarnya ini yang saya inginkan. Terima kasih.

BigBeagle
sumber
Tentu sebagian orang hanya ingin tahu cara mengonversi file .ver Avermedia .avi .mp4 sehingga mereka bermain di Mountain Lion / Mavericks <pre> ffmpeg -i 140203-1229.avi -vcodec copy -acodec copy fromavermedia_cog.mp4 </pre>

Jawaban:

3

Saya mencoba membantu. Pertama, saya tidak mengerti mengapa Anda mengatakan FFMPEG H.264 bukan format input?

Saya tidak tahu baris perintah FFMPEG dengan cukup baik (apakah ada orang yang tahu?;)). Harus ada saklar untuk pengkodean multi-kelas. Saya tahu ada beberapa preset bawaan yang mungkin bisa Anda gunakan dan lakukan hampir pasti apa yang Anda tuju. Ini biasanya disebut x264 preset atau x264 tune. Bisakah Anda menemukan yang seperti itu?

Zettt
sumber
Terima kasih. Pembicaraan Anda tentang preset telah membantu saya menemukan solusi yang memungkinkan. Saya akan mengedit posting untuk menunjukkan apa yang saya lakukan.
BigBeagle
Solusi yang bagus. Ditambahkan ke koleksi cuplikan saya. Terima kasih.
Zettt
2
@BigBeagle: Ketika Anda menemukan jawaban untuk pertanyaan Anda, Anda dapat mempostingnya sebagai jawaban. Mengedit pertanyaan Anda dilakukan untuk memberikan lebih banyak kejelasan untuk pertanyaan itu. Seperti yang saya mengerti, jawaban masuk ke bagian jawaban.
Nav
8

ffmpeg telah menghapus preset x264 mereka sehingga pengaturan -vpre tidak berfungsi lagi.

Sekarang, saya memiliki skrip untuk mengonversi file video ke format yang dapat ditangani oleh Ponsel saya.

ffmpeg -i input.avi -sws_flags lanczos+accurate_rnd -vf "scale=320:240" -c:v libx264 -crf 20 -preset veryslow -profile:v main -tune fastdecode -c:a copy output.mkv

Saya akan menjelaskan setiap opsi

-sws_flags lanczos+accurate_rnd opsi ini adalah algoritma downscaling, lanczos direkomendasikan karena menghasilkan artefak yang paling sedikit tanpa blur tetapi lambat.

-vf "scale=..." Cukup jelas tentukan resolusi output

-crf 20ini adalah kualitas, 20 adalah pengaturan akhir yang baik (jangan gunakan sebelum mengedit), ini adalah kualitas konstan dan merupakan pilihan terbaik ketika ukuran file tidak ketat dan akan menghasilkan kualitas yang lebih baik pada ukuran file terendah daripada yang lain , jika tidak, gunakan dua pass untuk kualitas maksimum pada ukuran file tertentu (seperti harus pas pada CD atau DVD), bitrate tetap (mis. -b 2000k) hanya boleh digunakan saat streaming, case khusus adalah '0' yang lossless dan kisaran opsi ini adalah dari 1 (kualitas tertinggi) hingga 50 (kualitas terendah).

Tes yang baik untuk ini adalah menjalankan melalui pengkodean dengan -crf 20 perhatikan bitrate, dan kemudian gunakan itu sebagai -b pengaturan untuk versi 2 file keduanya harus memiliki ukuran file yang sama, bandingkan keduanya untuk kualitas perbedaan.

-preset veryslow ini memilih berapa banyak CPU yang ingin Anda gunakan, semakin lambat itu semakin kecil ukuran file dan kualitas yang lebih baik.

-profile:v mainini adalah profil H.264 untuk digunakan. tinggi adalah ukuran file yang paling efisien tetapi menggunakan banyak CPU untuk memecahkan kode dibandingkan dengan format lain, yang dikatakan paling populer karena kebanyakan ponsel memiliki decoder hardware yang terpasang dan flash player mendukungnya, milikku tidak jadi aku harus gunakan main.

-tune fastdecode ponsel saya tidak suka memainkan file tanpa opsi ini, tetapi biasanya ini dapat dibiarkan kosong atau disetel ke 'film' untuk video game, alasan utama Anda menggunakan ini adalah untuk mendapatkan kualitas ekstra.

Dan hal terakhir yang saya sarankan menggunakan format wadah modern .avi tidak dirancang untuk menampung H.264 dan dari apa yang saya pahami tidak ada standar untuk menyimpan H.264 atau membuat file lebih besar dari 2GB, sebagian besar implementasi adalah peretasan dan cenderung untuk memiliki masalah, gunakan mkv atau mp4.

Daniel Hill
sumber
Preset untuk libx264 sekarang ditentukan oleh -presetsebagai di-preset slow
stib
-tune fastdecodemenonaktifkan deblocking, dan bingkai B dan P tertimbang, serta CABAC. Ada decoder yang dapat menangani frame B, tetapi tidak CABAC? Saya menyarankan -profile:v baseline, jika Anda perlu menargetkan decoder perangkat keras lama. ( fastdecodedapat bermanfaat jika menargetkan decoder perangkat lunak pada CPU yang lambat, tetapi bukan decoder perangkat keras.) Main dengan bingkai B tetapi tidak ada deblocking atau CABAC yang mungkin atau mungkin tidak terlihat lebih baik dari baseline dengan deblocking. +1 untuk merekomendasikan bukan-AVI untuk menyimpan h.264. IIRC, utamanya adalah bingkai B, tapi ya h.264 di avi tidak terstandarisasi dengan baik, dan itu hacky.
Peter Cordes
Saya akan memanggil -crf 20final yang tinggi. Anda dapat mengubahnya menjadi 22 atau bahkan 24 dan mungkin baik-baik saja, kecuali jika itu adalah gerakan yang hebat, seperti acara olahraga.
user24601
2

Ada beberapa hal yang perlu diperjelas:

  • Format bukan codec; Anda ingin mendapatkan file dalam format avi dengan video yang dikodekan dengan codec h264 . Cukup gunakan -vcodec libx264 dan nama file dengan .avi . Ffmpeg harus mengenali format dengan melihat ekstensi file, tetapi Anda mungkin juga menambahkan -f avi . Anda pasti tidak ingin menggunakan mpeg1, karena itu memberikan kualitas yang lebih buruk daripada mpeg2 atau bahkan lebih buruk dibandingkan dengan mpeg4, yang saya sarankan.
  • Masalah Anda adalah ffmpeg hanya menggunakan kualitas serendah mungkin karena Anda tidak menentukannya. Opsi -sameq tampaknya jarang berhasil untuk saya. Bahkan, sangat mudah untuk mengatur bitrate secara manual. Tambahkan, misalnya, -vb 3000k untuk mendapatkan file dengan bitrate video rata-rata 3Mb / s, yang memberikan kualitas yang cukup baik. Saya kira itu akan cukup bahkan bagi Anda untuk memiliki 2Mb / s untuk resolusi yang disebutkan.
  • Kunci untuk menurunkan filesize bukan resolusi, tetapi bitrate yang disebutkan di atas. Saya lebih suka tetap berpegang pada resolusi asli dan hanya memanipulasi bitrate.
  • Saya kira Anda juga ingin menjaga audio tanpa konversi (jadi tanpa kehilangan kualitas), jadi gunakan salinan -acodec .

Coba ini: ffmpeg -i highres.avi -acodec copy -vcodec libx264 -vb 2000k lowerres.avi

Piotr
sumber
4
Bitrate konstan adalah yang terburuk (dalam hal kualitas vs ukuran) dari semua mode kontrol laju di x264 dan harus dihindari. Gunakan -crfuntuk mengatur mode kualitas konstan.
slhck