Mam plik WMV (v9 (WMV3), 960x720, 30.000030 fps, planar 4: 2: 0 YUV, wyprodukowany przez PowerPoint 2010) i muszę przekonwertować go na MPEG2 - jedyny format, który mój telewizor może odczytać z dysku flash USB (Próbowałem też MP4 / h.264, AVI / XVID - działa tylko MPEG2).
Udało mi się do pracy z prostym
ffmpeg -i "in.wmv" -c:v mpeg2video "out.mpg"
ale jakość wyniku jest straszna (wprowadzane są wyraźnie widoczne zniekształcenia), a odtwarzanie nie jest płynne (w niektórych momentach zbyt wolne).
Próbowałem też
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"
(Znalazłem to gdzieś w Internecie i trochę zmodyfikowałem - z powodzeniem zmieniłem resoultion, częstotliwość odświeżania i format wyjściowy (z VOB do samego MPG)), ale jakość jest nadal zbyt zła.
Jakich parametrów muszę użyć, aby zaoszczędzić jak najwięcej jakości? Współczynnik kompresji w ogóle nie ma znaczenia, akceptowalny jest nawet wzrost rozmiaru pliku.
Kolejną rzeczą, której tak naprawdę potrzebuję (postanowiłem nie umieszczać go w tytule pytania, aby uniknąć uczynienia go zbyt szczegółowym, ale docenię to, biorąc pod uwagę odpowiedzi), dodaje czystą ciszę jako ścieżkę dźwiękową - w dźwięku nie ma oryginalny, ale telewizor narzeka na to i chciałbym się go pozbyć. Wygenerowałem plik OGG Vorbis o tej samej długości (z dokładnością do drugiej sekundy), używając Audacity, ale nie mogę scalić go z filmem:
ffmpeg -i in.mpg -i silence.ogg -c:v copy -c:a libmp3lame out.mpg
a nawet goły
ffmpeg -i in.mpg -c:v copy -out.mpg
powoduje błędy „niedopełnienie bufora” i „zbyt duży pakiet”. (in.mpg to pliki utworzone przez ten sam plik binarny FFMPEG i ten sam źródłowy plik WMV przy użyciu pierwszych dwóch poleceń w pytaniu).
Używam kompilacji Zeranoe FFMPEG w systemie Windows 7.
Philips 42PFL3606H/58
, koduję do H.264 za pomocą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 jest najniższy, jaki znam, a jeszcze więcej poprawek jest wykorzystywanych, aby ułatwić odtwarzanie pliku wynikowego.Odpowiedzi:
Problem polega na tym, że domyślna szybkość transmisji dla MPEG-2 jest raczej niska (jak w przypadku większości innych koderów wideo w ffmpeg, z wyjątkiem H.264). MPEG-2 nie jest obecnie najlepszym wyborem jako kodek.
Lepsza jakość dla MPEG-2
Masz kilka opcji, jeśli chcesz pozostać przy MPEG-2:
Zwiększ szybkość transmisji. Teraz używasz
-b:v 2500k
. Jeśli jest to wideo HD, nie zajedziesz daleko, mając tylko 2,5 MBit / s. Potrzebujesz co najmniej dwa razy więcej lub więcej, aby efekt wyglądał dobrze. Na przykład użyj-b:v 6000k -target pal-dvd
.W przypadku 720p uważam, że nadal powinieneś używać wyższej przepływności. Pamiętaj, że DVD używają MPEG-2 i zajmują około 4,7 GB na 2 godziny filmu, więc w rezultacie uzyskujesz około 5–8 MBit / s. MPEG-2 naprawdę nie jest bardzo wydajny pod względem kompresji i działa lepiej przy wyższych przepływnościach.
Użyj określonego ustawienia jakości. Zmień
-b:v …
na-qscale:v 2
. Liczba tutaj waha się od 1 do 31, a wyższa oznacza niższą jakość. Nie ma sensu przekraczać 4 lub 5. Jeśli nie zależy Ci na szybkości transmisji, zacznij od 2 i sprawdź, czy to Ci odpowiada.Bałagan z liczbą klatek B, metodą szacowania ruchu lub rozmiarem GOP może nieco poprawić jakość, ale nie spowoduje dużych zmian.
Cichy dźwięk
Służy
-f lavfi -i aevalsrc=0
do generowania cichego strumienia audio. Na przykład:Konieczne może być dodanie
-target pal-dvd
do powyższego polecenia, aby wymusić określony rozmiar bufora.Jako kodek wybrałem MP3. Pliki MPEG nie mogą zawierać dźwięku innego niż audio MPEG Layer I i II, a także strumieni PCM, więc użycie cichego pliku Ogg Vorbis nie będzie działać, chyba że również skonwertujesz strumień audio (co nie jest tym, co robisz, gdy używasz
-c:a copy
) .Użyj innego kodeka wideo
Jestem zaskoczony, że telewizor, który odtwarza pliki wideo, będzie czytał MPEG-2, ale nic więcej. Powinno być obsługiwane co najmniej wideo MPEG-4 część II (tak zwane „DivX” - koder MPEG-4 część II). Więc możesz spróbować:
Twój telewizor może także obsługiwać H.264, ale tylko określony profil. Spróbuj użyć
baseline
profilu, na przykład:W powyższym przykładzie użyłem opcji CRF, aby ustawić jakość zamiast
qscale
. Więcej informacji można znaleźć w przewodniku kodowania H.264 .źródło
ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v libxvid -qscale:v 2 -c:a libmp3lame "out.mp4"
) - koduje około 100 ramek, a następnie zaczyna zalewać ekran z błędami, takimi jak[mpeg @ 02f69ba0] buffer underflow i=0 bufi=235538 size=239761
i[mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it
.-b:v
. Dodałem to do mojej odpowiedzi. Odnośnie ustawień enkodera: Nie można ustawić każdej ramki w ramkę B. Potrzebujesz także oszacowania ruchu - im bardziej wyczerpująca metoda, tym lepsza kompresja. Ale jeśli jest to dynamiczny film, pierwszą rzeczą, której będziesz chciał, to znacznie zwiększyć szybkość transmisji. Ustawienia kodowania naprawdę nie mają większego wpływu. Co do Twojego błędu, czy jesteś pewien, że to błąd prawidłowego polecenia?[mpeg]
Błąd może zdarzyć się tylko, jeśli plik wyjściowy.mpg
, a nie po to.mp4
.ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"
oczywiście.-target pal-dvd
rozwiązuje problem,-bufsize
nie działa (próbowałem-b:v 7M -bufsize 7M -maxrate 7M
).Od razu powiedziałbym, że jeśli rozmiar pliku tak naprawdę nie ma znaczenia, po prostu eksperymentuj ze zwiększaniem przepływności.
Aby uzyskać cichy dźwięk, możesz po prostu użyć ffmpeg, nie wiem wystarczająco dużo o Audacity, aby dać komentarz. Użyłem tego wcześniej.
To nie zadziała, ponieważ używasz kontenera mpg, więc możesz spróbować. (Kontener mp3)
Wydawało mi się, że to działa.
źródło