Konwersja wideo do WebM za pomocą ffmpeg / avconv

18

Podczas próby optymalizacji rozmiaru moich filmów domowych konwertowane niektóre z nich do WebM jako test, używając pitivi na Xubuntu. Różnica wielkości jest znacząca. Wynikowy plik webm stanowi zaledwie około 10% oryginalnego pliku, podczas gdy jakość obrazu wygląda dla mnie prawie tak samo.

Próbowałem też wykonać konwersję, avconvaby móc ją napisać w skrypcie, ale plik wynikowy wygląda naprawdę kiepsko. Po przyjrzeniu się ustawieniom renderowania w Pitivi wypróbowałem kilka parametrów:, avconv -i $1 -q 5 -qmin 0 -qmax 63 ${1%.*}.webmale jakość nadal wygląda jak bzdura, więc wygląda na to, że brakuje mi / używam niewłaściwych parametrów. Czy ktoś wie, jakich parametrów należy użyć, aby przekonwertować film h264 na webm i uzyskać taką samą jakość jak w Pitivi?

Są to ustawienia w Pitivi: tworzenie projektu Pitivi Renderowanie do webm (wideo HTML5) konfiguracja kodeka

jeroen
źródło

Odpowiedzi:

53

Uwaga: Ta informacja jest oparta na Wiki FFmpeg o kodowaniu VP9 . Więcej informacji można znaleźć w tym artykule - będzie on stale utrzymywany i rozszerzany. Aby uzyskać najlepsze wyniki, należy użyć najnowszej wersji ffmpeg, pobierając ją ze strony internetowej (wystarczy kompilacja statyczna; zawiera ona libvps-vp9koder).

Zmienna przepływność

Kodowanie VBR zapewnia optymalną ogólną jakość, ponieważ koder może dowolnie wybierać liczbę bitów do przypisania do ramki. Wybierz ten tryb, chyba że przygotowujesz filmy do przesyłania strumieniowego o stałej przepływności.

Opcja 1: Kodowanie o stałej jakości

Zazwyczaj, jeśli nie chcesz kierować na określony rozmiar pliku, powinieneś pozwolić na swobodną zmianę bitrate, ponieważ doprowadzi to do najwyższej jakości. Możesz to zrobić, ustawiając bitrate na 0, a współczynnik stałej szybkości ( CRF ) na docelowy poziom jakości:

ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 output.webm

Wartość CRF może wynosić od 0–63. Niższe wartości oznaczają lepszą jakość. Zalecane wartości mieszczą się w zakresie 15–35, przy czym 31 jest zalecane dla wideo HD 1080p. Google ma przewodnik z dodatkowymi informacjami na ten temat .

Opcja 2: kodowanie dwuprzebiegowe z docelową przepływnością

Jeśli chcesz, aby plik miał określoną docelową szybkość transmisji lub rozmiar pliku, musisz określić szybkość i zastosować kodowanie dwuprzebiegowe (co zapewni optymalną dystrybucję jakości). Tutaj wybieramy 5 MBit / s, co powinno wystarczyć dla treści 1080p.

ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 5M -pass 1 -f webm /dev/null && \
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 5M -pass 2 output.webm

Użytkownicy systemu Windows muszą używać NULzamiast /dev/nulli ^zamiast \.

Stała szybkość transmisji

Po pierwsze, libvpx oferuje tryby kodowania o stałej przepływności i zmiennej przepływności . Zawsze, gdy jest to możliwe, należy unikać stałej szybkości transmisji (chyba że celujesz w określony rozmiar pliku lub scenariusz przesyłania strumieniowego), ponieważ średnia jakość na rozmiar pliku będzie gorsza. Mimo to możesz spróbować ustawić stały bitrate, jeśli nic więcej nie działa, np. Z 1 MBit / s:

ffmpeg -i input.mp4 -c:v libvpx-vp9 -minrate 5M -maxrate 5M -b:v 5M output.webm

Spójrz na wynik i zwiększ lub zmniejsz częstość bitów do swoich upodobań (lub ograniczeń rozmiaru pliku). Na przykład możesz użyć 500Klub 5M, i tak dalej.

Trzeba określić -minrate, -maxratea bitrate -b:vw celu kodera używać CBR. Wszystkie muszą mieć tę samą wartość - w przeciwnym razie wybierze inną docelową szybkość transmisji i wykona kodowanie VBR, ale o złej jakości.

Audio

Obecnie wybranym kodekiem audio do kodowania VP9 jest Opus. FFmpeg domyślnie wybierze potrzebny koder i jego opcje. Jeśli chcesz to wyraźnie ustawić -c:a libopus, możesz to zrobić. Więcej informacji znajduje się w libopusdokumentacji .

slhck
źródło
4
Jest to obecnie jedyny najlepszy przewodnik do kodowania VP8 w całym Internecie. Dobra robota, chciałbym móc raz jeszcze głosować!
evilsoup
@evilsoup Dziękujemy. Nadal go ulepszam i później dodam nową stronę na wiki FFmpeg.
slhck
To naprawdę cudowna odpowiedź! Teraz rozumiem, dlaczego moje wideo zawsze było tej samej niskiej jakości, ponieważ faktycznie zawsze używałem domyślnej wartości 256 kBit / s. Dziękuję Ci bardzo!
jeroen
Jakie były różnice wielkości między oryginalnym MP4 a skonwertowanym webm?
switz
1
@ Dan Właśnie zaktualizowałem przewodnik - zauważyłem, że był trochę przestarzały. Cieszę się, że uznałeś to za przydatne.
slhck