Używanie ffmpeg do kodowania wysokiej jakości wideo [zamknięte]

92

Mam zestaw klatek wideo zapisanych jako obrazy w katalogu i próbuję zakodować je do dobrej jakości wideo, jednak każde ustawienie i każdy format, które próbuję, generuje bardzo zauważalne artefakty.

Podstawowe polecenie jest takie:

ffmpeg -r 25 -i %4d.png myvideo.mpg

i wypróbowałem flagi minrate i maxrate. Dowolny format {mpg, avi, mov, flv} będzie odpowiedni.

Jakieś sugestie dotyczące ustawień? Ostateczny rozmiar pliku nie jest problemem.

CakeMaster
źródło
7
Na moim Mac, I użyć następującego polecenia: ffmpeg -r 20 -f image2 -i myImage%04d.png -f mp4 -q:v 0 -vcodec mpeg4 -r 20 myVideo.mp4. Okazało się, że aby wymusić liczbę klatek na sekundę, musiałem określić ją zarówno dla plików wejściowych, jak i wyjściowych. Ten kodek wydaje się działać dla mnie - być może nie musisz go określać. Chciałem po prostu zawrzeć to, co zrobiłem, ponieważ spędziłem nad tym dużo czasu. Jedynym minusem jest to, że moje obrazy wejściowe mają wysoki kontrast (niebieskie i czerwone kule na białym tle), a później w filmie kule zaczynają nabierać tego samego ciemnego koloru - niepożądany efekt kontrastu.
jvriesem
Dzięki @jvriesem! To działało świetnie dla mnie.
Dan Loewenherz
Proponuję zadać to pytanie w StackOverflow for Multimedia Systems
Hamed
wersja c ++ stackoverflow.com/a/43464269/6180077 odwiedź ten link, aby zapoznać się z działającą aplikacją do nagrywania ekranu w formacie FFMPEG c ++ mp4.
Abdullah Farweez
sprawdź ten link, który demonstruje programowe zapisywanie pliku wideo przy użyciu bibliotek FFMPEG: stackoverflow.com/a/43464269/6180077
Abdullah Farweez

Odpowiedzi:

64

Kilka rzeczy:

  • Musisz ustawić szybkość transmisji wideo. Nigdy nie używałem minrate i maxrate, więc nie wiem, jak dokładnie działają, ale ustawiając szybkość transmisji za pomocą -bprzełącznika, jestem w stanie uzyskać wysokiej jakości wideo. Musisz wymyślić szybkość transmisji, która zapewnia dobry kompromis między kompresją a jakością wideo. Być może będziesz musiał z tym poeksperymentować, ponieważ wszystko zależy od rozmiaru klatki, liczby klatek na sekundę i ilości ruchu w treści twojego wideo. Pamiętaj, że DVD ma średnio około 4-5 Mbit / s dla 720x480, więc zwykle zaczynam od tego i decyduję, czy potrzebuję więcej, czy mniej, a potem po prostu eksperymentuję. Na przykład możesz dodać -b 5000kdo wiersza poleceń, aby uzyskać mniejszą lub większą szybkość transmisji wideo DVD.

  • Musisz określić kodek wideo. Jeśli tego nie zrobisz, ffmpeg domyślnie wybierze MPEG-1, który jest dość stary i nie zapewnia kompresji zbliżonej do MPEG-4 lub H.264. Jeśli twoja wersja ffmpeg jest zbudowana z obsługą libx264, możesz to określić -vcodec libx264w linii poleceń. W przeciwnym razie -vcodec mpeg4wykona również lepszą pracę niż MPEG-1, ale nie tak dobrze, jak x264.

  • Istnieje wiele innych zaawansowanych opcji, które pomogą Ci uzyskać najlepszą jakość przy najniższych przepływnościach. Spójrz tutaj, aby zobaczyć kilka przykładów.

Jason B.
źródło
6
Stała szybkość transmisji jest niekorzystna dla jakości. Korzystanie ze współczynnika stałej szybkości jest lepsze (jest to jeden z trybów pracy x264). Na przykład: ffmpeg -i … -c:a copy -c:v libx264 -crf 18 -preset veryslow …. 18 to CRF z bardzo marginalną utratą jakości, ale przepływność będzie prawdopodobnie niska. Jeśli potrzebujesz mniejszego rozmiaru pliku, możesz wypróbować większe wartości CRF. Jak widzisz, jest to całkiem proste.
Wyświetlana nazwa
zwróć uwagę, że -b musi być przed wideo, ale po wejściu -i
mateuszb
45

Musisz określić opcję -vb, aby zwiększyć szybkość transmisji wideo, w przeciwnym razie otrzymasz wartość domyślną, która tworzy mniejsze filmy, ale z większą liczbą artefaktów.

Spróbuj czegoś takiego:

ffmpeg -r 25 -i %4d.png -vb 20M myvideo.mpg

jeff7
źródło
1
to działa dobrze dla mnie, dziękuję;)
thiago.adriano26
16

Upewnij się, że pliki PNG są całkowicie nieprzezroczyste przed utworzeniem wideo

np. z imagemagick, nadaj im czarne tło:

convert 0.png -background black -flatten +matte 0_opaque.png

Z moich testów wynika, że ​​żaden bitrate ani kodek nie są wystarczające, aby wideo wyglądało dobrze, jeśli karmisz pliki PNG ffmpeg z przezroczystością

Oran Fry
źródło
To rozwiązało problem.
Matěj Kripner
Ta wskazówka rozwiązała naprawdę irytującą niską jakość wideo. Wielkie dzięki.
dasmy
0

Jeśli nie wykonasz jakiejś obróbki końcowej, wideo nigdy nie będzie lepsze niż oryginalne klatki. Podobnie jak flipbook, jeśli wykonujesz duży „skok” między klatkami kluczowymi, będzie to wyglądać śmiesznie. Aby zapewnić płynną animację, zazwyczaj potrzeba wystarczającej liczby „animacji” między klatkami kluczowymi. HTH

JustBoo
źródło
Obrazy pochodzą z sekwencji wideo. Właśnie przeszli trochę kadrowania, skalowania i tego, czego nie zrobili z obrazami. Efekty są zdecydowanie artefaktami kompresji. Widziałem teraz ten post, który wydaje się mieć odpowiedź: stackoverflow.com/questions/3158235/…
CakeMaster
@CakeMaster Nie wspomniałem o stratnej kompresji, ponieważ w Twoim przykładzie są obrazy „.png”. Pliki .png mogą być stratne, ale uważam, że zazwyczaj nie są. Pliki .jpg są prawie zawsze stratne, stąd artefakty podczas ich używania. Jeśli możesz, możesz ponownie zapisać swoje pliki .png z bezstratną kompresją.
JustBoo