FFMPEG / x264: Pojedynczy przebieg: w jaki sposób podnieść szybkość początkową?

2

Kiedy używasz trybu jednoprzebiegowego z określonym rozmiarem VBV, libx264 początkowo „worek z piaskiem” bitrate, prawdopodobnie z powodu braku dowodów (a może nawet błędu). ( To ironiczne następstwo tego pytania, które dotyczyło zbyt wysokich początkowych przepływności przy kodowaniu jednoprzebiegowym bez specyfikacji VBV )

Aby uzyskać więcej informacji, zobacz wykresy szybkości transmisji bitów u dołu: zwróć uwagę na oryginalny spadek, a następnie overcorrection („Hej, mam trochę bitów!”) Przed normalizacją. Zauważ, że jest to poprawione w rozwiązaniu dwuprzebiegowym. Brak początkowej ramki I na tych dwóch wykresach jest prawdopodobnie błędem narzędzia (wartość PTS początkowej ramki I wynosi 0,15 sekundy).

Ten efekt zapobiega równoległemu przetwarzaniu długiego zasobu w „dzieleniu, kodowaniu i ponownym składaniu”, ponieważ na początku każdego segmentu uzyskuje się rytm jakości.

Można to naprawić za pomocą kodowania dwuprzebiegowego, co jest niedopuszczalnym rozwiązaniem dla strumieni na żywo (chociaż w przypadku paralelizacji można by zapłacić koszt kodowania dwuprzebiegowego).

Są dwa rozwiązania, na które chciałbym mieć nadzieję: każda pomoc byłaby bardziej niż mile widziana.

  1. Rozwiązanie jednoprzebiegowe, w którym enkoder ma na początku pomieścić o wiele więcej klatek przed wytworzeniem wyjścia, zmniejszając w ten sposób początkowy efekt worka z piaskiem

  2. Sposób wykonania ograniczonego dwuprzebiegowego kodowania jako „potoku”: pełne dwuprzebiegowe kodowanie jako potoku jest oczywiście nie sensowne, ale powinna istnieć możliwość „mikroprzepustów”, w których okres sprzężenia zwrotnego jest podobny druga. Jest to o wiele mniej idealne rozwiązanie niż rozwiązanie jednoprzebiegowe, aby obejść tak krótki efekt, ale byłoby do zaakceptowania, gdyby (1) było niemożliwe.

    • Wykres przepływności dla pojedynczego przejścia: zanotuj początkowy „spadek worka z piaskiem”. Wygenerowano z:

ffmpeg -i 1080-60fps.mp4 -vf "scale = 1200: 720" -b: v 1000k -bufsize 1000k onepass.mp4

wprowadź opis zdjęcia tutaj

  • Dwuprzebiegowy wykres przepływności: jest to prawie idealny wynik. Pamiętaj, że ta ostateczna forma nie musi być konieczna: wystarczające jest uniknięcie początkowego worka z piaskiem. Wygenerowano z:

ffmpeg -i 1080-60fps.mp4 -vf "scale = 1200: 720" -b: v 1000k -pass 1 -f mp4 / dev / null

ffmpeg -i 1080-60fps.mp4 -vf "scale = 1200: 720" -b: v 1000k -pass 2 twopass.mp4

Dwuprzebiegowy wykres przepływności: jest to oczekiwany wynik

  • Sekcja pierwszej ramki w kodowaniu jednoprzebiegowym

wprowadź opis zdjęcia tutaj

  • Sekcja pierwszej ramki w kodowaniu dwuprzebiegowym

wprowadź opis zdjęcia tutaj

Mark Gerolimatos
źródło
Czy próbowałeś trybu CRF?
Gyan