FFMPEG kullanarak mümkün olan en yüksek kalitede bir MPEG2 video dosyası nasıl yapılır?


16

WMV (v9 (WMV3), 960x720, 30.000030 fps, düzlemsel 4: 2: 0 YUV, PowerPoint 2010 tarafından üretildi) dosyasına sahibim ve MPEG2'ye dönüştürmem gerekiyor - TV setimin USB flash sürücüden okuyabileceği tek biçim (MP4 / h.264, AVI / XVID'yi de denedim - MPEG2'den başka hiçbir şey çalışmıyor).

İşi basitle başardım

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

ancak sonucun kalitesi korkunç (açıkça görülebilen görsel bozulmalar ortaya çıkıyor) ve oynatma düzgün değil (bazı anlarda çok yavaş).

Ben de denedim

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"

(Bunu internette bir yerde buldum ve biraz değiştirdim - resoultion, yenileme hızı ve çıkış formatını (VOB'dan çıplak MPG'ye) değiştirdi) ama kalitesi hala çok kötü.

Mümkün olduğunca fazla kalite kazanmak için hangi parametreleri kullanmam gerekir? Sıkıştırma oranı hiç önemli değil, dosya boyutundaki artış bile kabul edilebilir.

Aslında ihtiyacım olan başka bir şey (çok spesifik yapmaktan kaçınmak için soru başlığına eklememeyi seçtim, ancak cevaplarda değerlendirildiğini takdir ediyorum) bir ses parçası olarak saf sessizlik ekliyor - ses yok orijinal ama TV seti bu konuda şikayet ve bu şikayet kurtulmak istiyorum. Audacity kullanarak aynı uzunlukta (ikinci kesin) bir sessizlik OGG Vorbis dosyası oluşturdum ama video ile birleştirmek başaramazsınız:

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

ve hatta çıplak

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

"arabellek yetersizliği" ve "paket çok büyük" hataları veriyor. (in.mpg, söz konusu ilk iki komutu kullanarak aynı FFMPEG ikili dosyası ve aynı kaynak WMV dosyası tarafından üretilen dosyalardır).

Windows 7'de bir Zeranoe FFMPEG derlemesi kullanıyorum.


2
Birisi sizden tam çıktı günlüğü isteyecektir.
dstob

Tam olarak hangi TV seti? Sadece farklı bir profil olan H.264'ü okuyabilir.
slhck

@slhck TV seti, Philips 42PFL3606H/58H.264 ile kodluyorum 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 bildiğim en düşük değer ve ortaya çıkan dosyayı oynatmayı daha kolay bir görev haline getirmek için daha fazla ayar yapıldı .
Ivan

1
El kitabına göre TV, MPEG-4 Visual ve H.264'ü desteklemektedir. Temel profil işe yaramazsa, ne işe yaradığından emin değilim. Ancak TV'ler çok seçici.
slhck

Yanıtlar:


16

Sorun, MPEG-2 için varsayılan bit hızının oldukça düşük olmasıdır (ffmpeg'deki diğer çoğu video kodlayıcıda olduğu gibi, H.264 bir istisnadır). MPEG-2 de bu günlerde bir codec bileşeni olarak en iyi seçim değil.

MPEG-2 için daha iyi kalite

MPEG-2'ye bağlı kalmak istiyorsanız birkaç seçeneğiniz vardır:

  • Bit hızını artırın. Şimdi kullanıyorsunuz -b:v 2500k. HD video ise, yalnızca 2,5 MBit / sn ile fazla uzaklaşmazsınız. Sonucun iyi görünmesi için en az iki katına veya daha fazlasına ihtiyacınız var. Örneğin, kullanın -b:v 6000k -target pal-dvd.

    720p için hala daha yüksek bir bit hızı kullanmanız gerektiğini düşünüyorum. DVD'lerin MPEG-2 kullandığını ve 2 saatlik film için yaklaşık 4.7 GB kullandığını unutmayın, böylece yaklaşık 5-8 MBit / s ile sonuçlanırsınız. MPEG-2 gerçekten sıkıştırma açısından verimli değildir ve daha yüksek bit hızlarında daha iyi çalışır.

  • Belirli bir kalite ayarı kullanın. Değişim -b:v …için -qscale:v 2. Buradaki sayı 1 ila 31 arasındadır ve daha yüksek, daha düşük kalite anlamına gelir. 4 veya 5'in ötesine geçmenin bir anlamı yok. Bit hızı umursamıyorsanız 2 ile başlayın ve bunun sizin için işe yarayıp yaramadığına bakın.

B-kare sayısı, hareket tahmini yöntemi veya GOP boyutu ile uğraşmak kaliteyi biraz değiştirebilir, ancak büyük değişikliklere neden olmaz.

Sessiz ses

-f lavfi -i aevalsrc=0Sessiz bir ses akışı oluşturmak için kullanın . Örneğin:

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

-target pal-dvdBelirli bir arabellek boyutunu zorlamak için yukarıdaki komuta eklemeniz gerekebilir .

MP3'ü codec olarak seçtim. MPEG dosyaları PCM akışlarının yanı sıra MPEG Katman I ve II ses dışında ses de içeremez, bu nedenle ses akışını da dönüştürmedikçe sessiz bir Ogg Vorbis dosyası kullanmak işe yaramaz (kullandığınızda yaptığınız şey bu değildir -c:a copy) .

Farklı bir video codec bileşeni kullanın

Video dosyalarını çalan bir TV'nin MPEG-2'yi okuyacağından, başka bir şey okumamasından şaşırdım. En az MPEG-4 Part II video desteklenmelidir (MPEG-4 Part II kodlayıcı "DivX" olarak bilinir). Böylece deneyebilirsiniz:

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

TV'niz aslında H.264'ü destekleyebilir, ancak yalnızca belirli bir profili destekleyebilir. baselineProfili kullanmayı deneyin , örneğin:

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"

Yukarıdaki örnekte kaliteyi ayarlamak için CRF seçeneğini kullandım qscale. Daha fazla bilgi için H.264 kodlama kılavuzuna bakın .


"B-kare sayısı, hareket tahmini yöntemi veya GOP boyutu ile uğraşmak kaliteyi biraz değiştirebilir, ancak büyük değişikliklere neden olmaz." - Her kareyi bir B karesi yapabilir ve MPEG2 ile hareket tahmini kullanamaz mıyım? Videoda çok fazla dinamik parça var.
Ivan

Önerdiğiniz ilk komut satırını denedim ( ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4") - yaklaşık 100 kareyi kodlar ve sonra [mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761ve gibi hatalarla ekranı su basmaya başlar [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan

@Ivan Bit hızını ile değiştirirsiniz -b:v. Cevabıma ekledi. Kodlayıcı ayarlarıyla ilgili olarak: Her kareyi B karesi yapamazsınız. Ayrıca, hareket tahminine ihtiyacınız vardır - yöntem ne kadar kapsamlı olursa, sıkıştırma o kadar iyi olur. Ancak dinamik bir video ise, ilk isteyeceğiniz şey bit hızını önemli ölçüde artırmaktır. Kodlama ayarlarının gerçekten bir etkisi yoktur. Hatanıza gelince, bunun doğru komutun hatası olduğundan emin misiniz? Bir [mpeg]hata, yalnızca çıktı dosyanız olduğunda .mpgdeğil, olduğunda olabilir .mp4.
slhck

Copy = yanlış bir parçayı yapıştırdım, @slhck, ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"elbette kullanıyorum .
Ivan

1
-target pal-dvdSorunu çözer, -bufsizeçalışmaz (denedim -b:v 7M -bufsize 7M -maxrate 7M).
Ivan

0

Dosya boyutu gerçekten önemli değilse hemen söyleyebilirim, o zaman sadece bit hızını artırmayı deneyin.

Sessiz ses için sadece ffmpeg kullanmak isteyebilirsiniz, Audacity hakkında herhangi bir yorum yapmak için yeterli bilmiyorum. Bunu daha önce kullandım.

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

Eğer mpg konteyner kullandığınız için bu olsa sizin için çalışmaz, bu yüzden denemek isteyebilirsiniz. (Mp3 konteyner)

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

Benim için işe yarıyor gibiydi.


Sürenin ayarlanması gerekli değildir, çünkü ffmpeg video için gerekli olan her şeyi kullanır.
slhck

Ivan'ın yaptığı gibi işleri iki adımda tuttum. Komutumdaki süreyi dışarıda bırakırsanız, ffmpeg'in ne kadar süre çalışacağını bilmiyorum (muhtemelen istediğinizden daha uzun).
dstob
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.