ffmpeg - Jak skopiować | wyodrębnić ustawienia kodowania z istniejącego pliku multimedialnego?

19

Chciałem móc to teraz robić wiele razy, więc pytam.

Jeśli mam istniejący plik wideo lub audio ffmpeg, mplayera inne odtwarzacze multimedialne mogą wykryć przynajmniej niektóre z jego „właściwości”, takich jak używany kontener, kodek i szybkość transmisji, prawdopodobnie różne ustawienia jakości i kodowania itp.

Jak mogę wyodrębnić te ustawienia z istniejącego pliku, aby użyć ich (bezpośrednio) do kodowania za pomocą ffmpeg?

Na przykład mam mkvwideo zakodowane x264z pewnymi ustawieniami i innym nieskompresowanym aviplikiem. Chciałbym „skopiować” ustawienia kodowania używane w pliku x264 mkv w celu transkodowania avi przy użyciu tych samych ustawień.

Uwaga: szukam sposobu, który nie powinien obejmować ludzkiej pracy z „tłumaczeniem” ustawień z dekodera na koder. W porządku, jeśli najpierw muszę wyodrębnić ustawienia i zapisać je gdzieś, ale chciałbym móc po prostu podać opcje odczytu do wiersza poleceń lub wstępnie skonfigurowanego pliku konfiguracyjnego dla ffmpeg.

n611x007
źródło
Cóż, można prawdopodobnie sortowania wyjściu ffprobe(zwłaszcza z -show_streamsi -show_formatopcji) oraz wykorzystywać te informacje do skryptu ważne rzeczy
evilsoup
1
Często używanie tych samych ustawień, takich jak bitrate (próby skopiowania dokładnej bitrate wydają się popularne wśród użytkowników), nie da optymalnej jakości. Oczywiście nie mam pojęcia, jakie są typowe dane wejściowe, ale przy x264 -crfogólnie zaleca się użycie tej opcji. Zobacz Podręcznik kodowania FFmpeg i x264 .
llogan
Nie mogę znaleźć niczego na temat ustawień kodowania w wyjściu ffprobe :(
thelolcat
Pokazuje tylko liczbę ReFrame, ale nie inne ustawienia jak
mediainfo
Składnia wejściowa z ffmpeg różni się od pól metadanych. np. możesz czytać channels:6z pliku wideo, ale aby go zakodować, musisz użyć przełącznika -ch:6. Niektóre przełączniki używają 1 litery, niektóre używają dwóch itd.
jiggunjer

Odpowiedzi:

10

Nie ma na to automatycznego sposobu. Musisz spojrzeć na parametry oryginalnego pliku i zastosować je do pliku wyjściowego.

W większości przypadków będą to:

  • Format kontenera (MP4, MKV,…)
  • Kodek wideo i audio (H.264, H.265,…)
  • Specyficzne dla audio:
    • Liczba kanałów audio
    • Częstotliwość próbkowania audio
    • Szybkość transmisji audio
  • Specyficzne dla wideo:
    • Profil i poziom (w celu zapewnienia zgodności, patrz tutaj )
    • Ograniczenia maksymalnej przepływności (np. Dla H.264 )
    • Maksymalna rozdzielczość wideo, zmiana za pomocą -filter:v scalelub-s:v
    • Szybkość klatek, zmiana przez -filter:v fps -r
    • Podpróbkowanie barwy, zmiana przez -pix_fmt(np. -pix_fmt yuv420pPowinna zapewnić najlepszą kompatybilność)
    • Rozmiar GOP (odległość między ramkami IDR), ustawiany za pomocą -g
    • Inne określone ustawienia kodowania

Ale nawet jeśli wszystko jest w porządku, niektóre urządzenia mogą wymagać określonych, zastrzeżonych informacji osadzonych w strumieniu bitów.


Jeśli chodzi o konkretne zadanie użycia x264, nie będzie to trywialne. Nie znam żadnego skryptu, który zająłby się tymi zadaniami, które zwykle wykonuje się ręcznie. Aby uzyskać więcej informacji o ustawieniach kodowania, w systemach Unix / Linux lub OS X można użyć mediainfoniektórych sztuczek Bash.

Na przykład dla wideo zakodowanego w formacie x264 w pliku MP4:

mediainfo input.mp4 | grep "Encoding settings" | cut -d':' -f2- | tr '/' '\n' | sed 's/ //'

Spowoduje to wyświetlenie listy opcji x264:

cabac=1
ref=3
deblock=1:-1:-1
analyse=0x3:0x113
me=hex
subme=7
psy=1
…

Następnie możesz ręcznie przekazać te opcje do pliku binarnego x264.

Jeśli przejdziesz przez FFmpeg, jest to trochę bardziej skomplikowane, ponieważ nie wszystkie opcje x264 mogą lub powinny być odwzorowane w ten sposób. Należy zauważyć, że często prosta opis stacji, i dostosować profil zrobi, jak również (jak widać x264 --fullhelpi prowadnicy kodowania x264 ), określający poziom CRF jest wystarczające.

I to nawet nie bierze pod uwagę dźwięku, gdzie na szczęście nie ma tak wielu opcji.

slhck
źródło
Więc nie jest to możliwe z ffprobe lub ffmpeg?
thelolcat,
Nie, nie jest to możliwe bezpośrednio z ffprobe / ffmpeg. W przypadku wideo zakodowanego w x264 użyłbym danych mediainfowyjściowych i zamapowałbym te opcje na ffmpeg -x264-params. (Zobacz także przewodnik kodowania x264 ). Ale jeśli potrzebujesz ogólnego rozwiązania dla wszystkich rodzajów kodeków / koderów lub formatów kontenerów, musisz napisać średnio zaawansowany skrypt, który dokonuje konwersji.
slhck,