Zmień częstotliwość klatek wideo MP4 za pomocą ffmpeg

8

Mam wideo w formacie mp4 z częstotliwością klatek .33(1 klatka przez 3 sekundy). Chcę zwiększyć częstotliwość klatek do 5 klatek / s. Próbowałem poniższego polecenia, ale nic nie robi:

ffmpeg -i <input.mp4> -r 5 <output.mp4>

Masz pojęcie, dlaczego ffmpeg ignoruje -ropcję?

Firemonkey
źródło
Jeśli próbujesz przyspieszyć / spowolnić wideo, zamiast powielać / upuszczać klatki, zobacz superuser.com/questions/854753 /... i / lub askubuntu.com/questions/370692
Peter Cordes

Odpowiedzi:

7

Wiem, że to stare pytanie, ale żadna z obecnych odpowiedzi nie jest już zalecana.

Remuxing bezstratny (wideo)

Jak zauważono w komentarzach, istnieje sposób, aby to zrobić, gdy wideo nie musi być ponownie kodowane. Wymaga przebudowania pliku do innego formatu kontenera MKV, a następnie z powrotem do MP4. Oto przykład, który zmienia wideo na 12 klatek na sekundę:

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy slow-video.mp4

Jeśli film zawiera dźwięk można również zwolnić że się bez zmiany wysokości dźwięków, ale to nie konwersja bezstratna. W poniższym przykładzie założono, że wideo źródłowe miało 24 klatki / sekundę, więc dźwięk musiał zostać spowolniony do połowy (0,5) za pomocą filtra atempo ffmpeg .

mkvmerge --default-duration 0:12fps --fix-bitstream-timing-information 0 original-video.mp4 -o temp-video.mkv
ffmpeg -i temp-video.mkv -c:v copy -c:a aac -filter:a "atempo=0.5" slow-video-with-audio.mp4

Poradnik FFMPEG Wiki

Oto wskazówki z wiki ffmpeg . Pamiętaj, że wszystkie te opcje wymagają ponownego kodowania wideo.

Przyspieszenie / spowolnienie wideo

Możesz zmienić prędkość strumienia wideo za pomocą filtra wideo setpts. Zwróć uwagę, że w poniższych przykładach strumień audio nie jest zmieniany, więc najlepiej byłoby wyłączyć go za pomocą opcji -an.

Aby podwoić prędkość wideo, możesz użyć:

ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv

Filtr działa poprzez zmianę znacznika czasu prezentacji (PTS) każdej klatki wideo. Na przykład, jeśli na znacznikach czasowych 1 i 2 wyświetlane są dwie kolejne klatki, a chcesz przyspieszyć wideo, te znaczniki czasu muszą mieć odpowiednio wartość 0,5 i 1. Dlatego musimy je pomnożyć przez 0,5.

Zauważ, że ta metoda spowoduje upuszczenie klatek w celu osiągnięcia pożądanej prędkości. Można uniknąć pomijania klatek, określając wyższą wyjściową częstotliwość klatek niż dane wejściowe. Na przykład, aby przejść od wejścia 4 FPS do takiego, który jest przyspieszony nawet czterokrotnie (16 FPS):

ffmpeg -i input.mkv -r 16 -filter:v "setpts=0.25*PTS" output.mkv

Aby spowolnić wideo, musisz użyć mnożnika większego niż 1:

ffmpeg -i input.mkv -filter:v "setpts=2.0*PTS" output.mkv

Gładki

Możesz wygładzić wolne / szybkie wideo za pomocą filtra wideo minterpolate. Jest to również znane jako „interpolacja ruchu” lub „przepływ optyczny”.

ffmpeg -i input.mkv -filter "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=120'" output.mkv

Inne opcje obejmują slowmoVideo i Butterflow. Przyspieszenie / spowolnienie dźwięku

Możesz przyspieszyć lub spowolnić dźwięk dzięki filtrowi audio atempo. Aby podwoić prędkość dźwięku:

ffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv

Filtr atempo ogranicza się do używania wartości z zakresu od 0,5 do 2,0 (więc może spowolnić do nie mniej niż połowy oryginalnej prędkości i przyspieszyć do nie więcej niż dwukrotności wejściowej). W razie potrzeby możesz obejść to ograniczenie, łącząc ze sobą wiele filtrów atempo. Następujące z czterokrotnie większą prędkością dźwięku:

ffmpeg -i input.mkv -filter:a "atempo=2.0,atempo=2.0" -vn output.mkv

Za pomocą złożonego wykresu filtru możesz jednocześnie przyspieszyć wideo i audio:

ffmpeg -i input.mkv -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mkv
pseudosavant
źródło
1
Możliwe jest przyspieszenie / spowolnienie po prostu przez ponowne przemodelowanie, ale FFmpeg nie wie, jak to zrobić . np. dla mkv, mkvtoolnix może to zrobić. np. mkvmerge --default-duration 0:24000/1001fps --fix-bitstream-timing-information 0 in.mkv -o out.mkv Zmień ilość klatek na sekundę na pojemniku MKV . Możesz przełączyć na MKV i wrócić do MP4, lub znaleźć narzędzie, które zrobi to bezpośrednio dla MP4. xkodowanie wideo jest bardzo obciążające procesor i powoduje straty, więc jest to okropna opcja.
Peter Cordes,
Całkowicie zgodzono się, że zmiana na niższą liczbę klatek na sekundę jest preferowana, ponieważ jest to podejście bezstratne, które wymaga znacznie mniej zasobów. W praktyce nie znalazłem jednak dobrego narzędzia do robienia tego z MP4. Nie próbowałem tak naprawdę ostatnio, ale kiedy pisałem tę odpowiedź, miałem remuxing MP4-> MKV-> MP4 i nie mogłem go uruchomić przy użyciu mkvtoolnix, ffmpeg i / lub mp4box. Będę musiał spróbować z parametrami, które sugerujesz.
pseudosavant
6

Jeśli plik wejściowy nie ma prawidłowej liczby klatek na sekundę, może być konieczne jawne ustawienie go

ffmpeg -r 1 -i input.mp4 -r 24 output.mp4
Martin Beckett
źródło
Transkoduje to, gdy naprawdę trzeba tylko remuxować. (Chyba że faktycznie chcesz powielać / upuszczać klatki zamiast spowalniać / przyspieszać wideo.)
Peter Cordes
3

Zmienioną liczbę klatek na sekundę można uzyskać tylko wtedy, gdy plik wejściowy zostanie sklasyfikowany jako plik „surowy”:

ffmpeg -r 5 -f h264 -i input.h264 -vcodec copy -an output.mkv

Bez określenia -f h264, domyślnie będzie to 25 fps i nie będzie można go zmienić. Najwyraźniej było tak dlatego, że w strumieniu brakowało jakichkolwiek informacji o liczbie klatek na sekundę i jest to domyślna liczba klatek na sekundę ffmpeg.

Najwyraźniej, gdy użyjesz -rjako opcji wyjściowej, powielają lub upuszczają klatki, więc wideo jest odtwarzane z tą samą prędkością - w tym przypadku nie to, czego chcesz! Ale zmiana wejściowej liczby klatek na sekundę spowoduje przyspieszenie lub zwolnienie wideo bez utraty lub powielenia klatek.

Malvineous
źródło
1
Moja przydatna odpowiedź. Tutaj nie ma możliwości ponownego kodowania
yota
1

Taka cecha - zmiana liczby klatek na sekundę - nazywa się „dostosowującą się” i jest często używana do tworzenia zwolnionego lub szybkiego przewijania, na przykład pokazania wzrostu rośliny w ciągu kilku minut. ffmpeg nie zezwala na nadpisywanie / zmienianie liczby klatek na sekundę bez ponownego kodowania . Jeśli tak się stanie, czas trwania ulegnie zmianie, a dźwięk nie będzie zsynchronizowany, chyba że zostanie osobno naprawiony. Ale obawiam się, że dźwięk nie jest interesujący w twoim przypadku z liczbą klatek na sekundę .33

Chcesz być zgodny, ponieważ po prostu chcesz zmienić ilość klatek na sekundę, ale ffmpeg ignoruje -rpo cichujeśli liczba klatek na sekundę jest określona w pliku wejściowym. Ponieważ plik wejściowy ma format .mp4, jego szybkość klatek ma pierwszeństwo-rkiedy ponowne kodowanie nie jest potrzebne. Do tego potrzebujesz innego narzędzia: mencoder.

Zakładając, że plik wejściowy nie zawiera dźwięku - prawdopodobnie prawdziwy dla każdego filmu z szybkością 0,33 klatek na sekundę - potrzebujesz:

$ mencoder -fps 5 -o <output> -ovc copy -nosound <input.mp4>

Zauważ, że domyślnie mencoder produkuje dane wyjściowe w formacie AVI.

Tankman 六四
źródło
1
To jest źle. Jeśli rjest określony jako przełącznik wyjściowy, ffmpeg będzie generować dane wyjściowe przy określonej liczbie klatek na sekundę, niezależnie od liczby klatek na sekundę na wejściu. Jeśli rjest określony jako przełącznik wejściowy, ffmpeg będzie duplikować lub upuszczać ramki w razie potrzeby, aby podać określoną liczbę klatek na sekundę sygnału wejściowego do filtra / kodera.
Gyan
Zachowanie, które ropisujesz, gdy jest przełącznikiem wejściowym, jest sprzeczne z moim wcześniejszym eksperymentem w formacie .mp4, notatką Malvineousa (na tej stronie) i opisem błędu 403 trac.ffmpeg.org/ticket/403 ; Twój opis, kiedy rjest używany na wyjściu, ma miejsce podczas ponownego kodowania, podczas gdy scenariusz OP wydaje się być zgodnym przypadkiem (naprawić szybkość klatek bez ponownego kodowania) przez fakt, że miał 0,33 klatek na sekundę.
Tankman 六四
1
Sprawdź wklejony raport tutaj . Zwróć uwagę na wiersz poleceń u góry, metadane wejściowe i wyjściowe, a na końcu nie. ramek zakodowanych.
Gyan
1
Zgodzono się, że OP chce po prostu dostosować plik, ale podane polecenie ponownie koduje, ponieważ nie określono przełącznika (ów) kopiowania. W tym scenariuszu ffmpeg powinien generować nowy strumień na rfps.
Gyan
Dziękuję Mulvya za przekonującą próbkę. Tak, masz rację na temat korzystania z -r. To użycie nie mogło wpłynąć na moje wcześniejsze eksperymenty w odpowiedzi na OP, ponieważ myśląc o zgodnym przypadku, nigdy nie upuściłem parametru kopiowania z ffmpeg, a -rzatem jest ignorowany. Napisałem prośbę o dodanie
Tankman 六四
0

Najszybszym sposobem jest utworzenie pliku BAT w katalogu z następującymi wierszami:

@ECHO OFF

for %%f in (*.mp4) do (

echo “fullname: %%f”

del temp.mkv

mkvmerge --default-duration 0:18fps --fix-bitstream-timing-information 0 %%f -o temp.mkv

del %%f

ffmpeg -i temp.mkv -c:v copy %%f

del temp.mkv

)

Musisz mieć mkvmerge i ffmpeg w tym samym katalogu. Automatycznie zmienia każdy plik MP4 w kilka sekund bez utraty jakości.

Peder Gerdin
źródło