Jak zrobić plik wideo MPEG2 o najwyższej możliwej jakości przy użyciu FFMPEG?


16

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.


2
Ktoś poprosi cię o pełny dziennik wyników.
dstob

Jaki dokładnie telewizor? Może być w stanie odczytać H.264, tylko inny profil.
slhck

@slhck Telewizor jest 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.
Ivan

1
Zgodnie z instrukcją telewizor obsługuje formaty MPEG-4 Visual i H.264. Jeśli profil linii podstawowej nie działa, nie jestem pewien, co działa. Ale telewizory są bardzo wybredne.
slhck

Odpowiedzi:


16

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=0do generowania cichego strumienia audio. Na przykład:

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

Konieczne może być dodanie -target pal-dvddo 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ć:

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

Twój telewizor może także obsługiwać H.264, ale tylko określony profil. Spróbuj użyć baselineprofilu, na przykład:

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"

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 .


„Bałagan z liczbą klatek B, metodą szacowania ruchu lub rozmiarem GOP może nieco poprawić jakość, ale nie spowoduje dużych zmian”. - czy mogę po prostu przekształcić każdą ramkę w ramkę B i nie używać szacowania ruchu w MPEG2? Film ma wiele bardzo dynamicznych części.
Ivan

Próbowałem pierwszej linii poleceń, którą sugerujesz ( 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=239761i [mpeg @ 02f69ba0] packet too large, ignoring buffer limits to mux it.
Ivan

@ Ivan Zmieniasz bitrate za pomocą -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.
slhck

Skopiowałem = wkleiłem niewłaściwą część, @slhck, używam ffmpeg -i "in.wmv" -f lavfi -i aevalsrc=0 -shortest -c:v mpeg2video -qscale:v 2 -c:a libmp3lame "out.mpg"oczywiście.
Ivan

1
-target pal-dvdrozwiązuje problem, -bufsizenie działa (próbowałem -b:v 7M -bufsize 7M -maxrate 7M).
Ivan

0

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.

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

To nie zadziała, ponieważ używasz kontenera mpg, więc możesz spróbować. (Kontener mp3)

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

Wydawało mi się, że to działa.


Ustawienie czasu trwania nie jest konieczne, ponieważ ffmpeg użyje tylko tego, co jest konieczne do filmu.
slhck

Przestrzegałem dwuetapowego procesu, tak jak Iwan. Jeśli pominiesz czas trwania w moim poleceniu, to nie wiem, jak długo działałby ffmpeg (prawdopodobnie dłużej, niż byś chciał).
dstob
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.