Bagaimana cara membuat file video MPEG2 dengan kualitas setinggi mungkin menggunakan FFMPEG?

16

Saya telah mendapatkan file WMV (v9 (WMV3), 960x720, 30.000030 fps, planar 4: 2: 0 YUV, diproduksi oleh PowerPoint 2010) dan perlu mengubahnya menjadi MPEG2 - satu-satunya format TVset saya dapat membaca dari USB flash drive. (Saya juga sudah mencoba MP4 / h.264, AVI / XVID - hanya MPEG2 yang berfungsi).

Saya telah berhasil melakukan pekerjaan dengan sederhana

ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"

tetapi kualitas hasilnya mengerikan (distorsi visual yang terlihat jelas diperkenalkan) dan pemutarannya tidak mulus (terlalu lambat pada beberapa saat).

Saya juga sudah mencoba

ffmpeg -i "in.wmv" -c:v mpeg2video -pix_fmt yuv420p -me_method epzs -threads 4 -r 30.000030 -g 45 -bf 2 -trellis 2 -cmp 2 -subcmp 2 -s 960x720 -b 2500k -bt 300k -async 1 -y "out.mpg"

(Saya telah menemukan ini di suatu tempat di Internet dan dimodifikasi sedikit - mengubah resoultion, refresh rate dan format output (dari VOB ke telanjang MPG)) berhasil tetapi kualitasnya masih terlalu buruk.

Parameter apa yang harus saya gunakan untuk menghemat kualitas sebanyak mungkin? Rasio kompresi tidak masalah sama sekali, bahkan peningkatan ukuran file dapat diterima.

Hal lain yang benar-benar saya butuhkan (saya memilih untuk tidak memasukkannya dalam judul pertanyaan untuk menghindari membuatnya terlalu spesifik tapi saya menghargai itu dipertimbangkan dalam jawaban) menambahkan keheningan murni sebagai trek suara - tidak ada suara dalam asli tetapi TV mengeluh tentang hal itu dan saya ingin menyingkirkan keluhan ini. Saya telah menghasilkan file OGG Vorbis yang sama panjang (tepat kedua) menggunakan Audacity tetapi saya tidak bisa menggabungkannya dengan video:

ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg

dan bahkan telanjang

ffmpeg -i in.mpg -c:v copy -out.mpg

memberikan "buffer underflow" dan "paket terlalu besar". (in.mpg adalah file yang dihasilkan oleh biner FFMPEG yang sama dan file WMV sumber yang sama menggunakan dua perintah pertama dalam pertanyaan).

Saya menggunakan Zeranoe FFMPEG build di Windows 7.

Ivan
sumber
2
Seseorang akan meminta Anda untuk log keluaran penuh.
dstob
Apa sebenarnya TV? Mungkin bisa membaca H.264, hanya profil yang berbeda.
slhck
Sslhck Set TV adalah Philips 42PFL3606H/58, saya menyandikan ke H.264 dengan ffmpeg -i "in.wmv" -sws_flags lanczos+accurate_rnd -c:v libx264 -crf 20 -preset slow -profile:v baseline -level 3.0 -pix_fmt yuv420p -tune fastdecode -x264-params keyint=240:min-keyint=20 "out.mp4"- profil adalah yang terendah yang saya tahu dan bahkan lebih banyak tweak digunakan untuk membuat memainkan file yang dihasilkan menjadi tugas yang lebih mudah.
Ivan
1
Menurut manual, TV mendukung MPEG-4 Visual dan H.264. Jika profil Baseline tidak berfungsi, saya tidak yakin apa yang terjadi. Tetapi TV sangat pemilih.
slhck

Jawaban:

16

Masalahnya adalah bahwa bitrate default untuk MPEG-2 agak rendah (seperti kebanyakan encoders video lainnya di ffmpeg, yang H.264 menjadi pengecualian). MPEG-2 juga bukan pilihan terbaik sebagai codec hari ini.

Kualitas yang lebih baik untuk MPEG-2

Anda memiliki beberapa opsi jika ingin tetap menggunakan MPEG-2:

  • Tambah bitrate. Anda sekarang menggunakan -b:v 2500k. Jika video HD, Anda tidak akan jauh dengan hanya 2,5 MBit / s. Anda membutuhkan setidaknya dua kali lipat atau bahkan lebih untuk membuat hasilnya terlihat bagus. Sebagai contoh, gunakan -b:v 6000k -target pal-dvd.

    Untuk 720p, saya pikir Anda masih harus menggunakan bitrate yang lebih tinggi. Ingatlah bahwa DVD menggunakan MPEG-2 dan menghasilkan sekitar 4,7 GB untuk 2 jam film, sehingga Anda mendapatkan sekitar 5-8 MBit / s. MPEG-2 benar-benar tidak terlalu efisien kompresi dan bekerja lebih baik pada bitrate yang lebih tinggi.

  • Gunakan pengaturan kualitas tertentu. Ubah -b:v …ke -qscale:v 2. Angka di sini berkisar dari 1 hingga 31 dan lebih tinggi berarti kualitas lebih rendah. Tidak ada gunanya melampaui 4 atau 5. Jika Anda tidak peduli dengan bitrate, mulailah dengan 2 dan lihat apakah itu bekerja untuk Anda.

Bercak dengan jumlah B-frame, metode estimasi gerakan atau ukuran GOP mungkin sedikit mengubah kualitas tetapi tidak akan menghasilkan perubahan besar.

Audio senyap

Gunakan -f lavfi -i aevalsrc=0untuk menghasilkan aliran audio diam. Sebagai contoh:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"

Anda mungkin perlu menambahkan -target pal-dvdperintah di atas untuk memaksa ukuran buffer tertentu.

Saya memilih MP3 sebagai codec. File MPEG tidak dapat mengandung audio selain MPEG Layer I dan II audio serta aliran PCM, jadi menggunakan file Ogg Vorbis yang diam tidak akan berfungsi kecuali jika Anda mengonversi aliran audio juga (yang bukan yang Anda lakukan saat menggunakan -c:a copy) .

Gunakan codec video yang berbeda

Saya terkejut bahwa TV yang memutar file video akan membaca MPEG-2 tetapi tidak hal lain. Setidaknya video MPEG-4 Bagian II harus didukung (itulah yang Anda kenal sebagai "DivX" - enkoder MPEG-4 Bagian II). Jadi Anda bisa mencoba:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"

TV Anda mungkin sebenarnya juga mendukung H.264, tetapi hanya profil tertentu. Coba gunakan baselineprofil, misalnya:

ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libx264 -profile:v baseline -crf 23 -c:a aac -strict experimental "out.mp4"

Dalam contoh di atas saya telah menggunakan opsi CRF untuk mengatur kualitas alih-alih qscale. Lihat panduan pengkodean H.264 untuk lebih lanjut.

slhck
sumber
"Bercak dengan jumlah B-frame, metode estimasi gerakan atau ukuran GOP mungkin sedikit mengubah kualitas tetapi tidak akan menghasilkan perubahan besar." - bisakah saya membuat setiap frame sebagai B-frame dan tidak menggunakan estimasi gerak dengan MPEG2? Video ini memiliki banyak bagian yang SANGAT dinamis.
Ivan
Saya telah mencoba baris perintah pertama yang Anda sarankan ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4") - ini mengkodekan sekitar 100 frame dan kemudian mulai membanjiri layar dengan kesalahan seperti [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761dan [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan
@Van Anda mengubah bitrate dengan -b:v. Menambahkannya ke jawaban saya. Mengenai pengaturan encoder: Anda tidak dapat membuat setiap frame sebagai B-frame. Selain itu, Anda memerlukan estimasi gerakan - semakin banyak metode, semakin baik kompresi. Tetapi jika ini adalah video yang dinamis, hal pertama yang Anda inginkan adalah meningkatkan bitrate secara signifikan. Pengaturan pengkodean benar - benar tidak memiliki banyak dampak. Adapun kesalahan Anda, apakah Anda yakin ini adalah kesalahan pada perintah yang benar? Sebuah [mpeg]kesalahan hanya dapat terjadi jika file output Anda .mpg, bukan ketika itu .mp4.
slhck
Saya telah menyalin = menempelkan bagian yang salah, @slhck, saya menggunakan ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"tentu saja.
Ivan
1
-target pal-dvdmemecahkan masalah, -bufsizejangan bekerja (saya sudah mencoba -b:v 7M -bufsize 7M -maxrate 7M).
Ivan
0

Saya akan segera mengatakan jika ukuran file tidak terlalu penting maka coba saja dengan meningkatkan bit-rate.

Untuk audio bisu Anda mungkin hanya ingin menggunakan ffmpeg, saya tidak cukup tahu tentang Audacity untuk memberikan komentar. Saya telah menggunakan ini sebelumnya.

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.aac

Ini tidak akan bekerja untuk Anda karena Anda menggunakan wadah mpg sehingga Anda mungkin ingin mencoba. (Wadah mp3)

ffmpeg.exe -f lavfi -i aevalsrc=0:0::duration=YOUR_DESIRED_DURATION -ab 10k YourAudioName.mp3

Tampaknya berhasil bagi saya.

dstob
sumber
Mengatur durasi tidak diperlukan, karena ffmpeg hanya akan menggunakan apa pun yang diperlukan untuk video.
slhck
Saya menyimpan beberapa hal dalam proses dua langkah seperti yang telah dilakukan Ivan. Jika Anda meninggalkan durasi dalam perintah saya maka saya tidak tahu berapa lama ffmpeg akan berjalan (kemungkinan lebih lama dari yang Anda inginkan).
dstob