Powtórzyć / zapętlić wejście wideo za pomocą ffmpeg?

52

Chcę tylko zapętlić wideo MP4 z ffmpeg i zachować bieżące ustawienia i kodek.

Na przykład jeśli input.mp4 ma długość 0:10 i chciałbym zapętlić go 4 razy, więc output.mp4 ma długość 0:40, jak mogę zmienić następujący wiersz poleceń, aby to zrobić?

ffmpeg -i input.mp4 -c copy output.mp4

Próbowałem...

ffmpeg -loop 4 -i input.mp4 -c copy output.mp4

... ale pojawia się błąd „Nie znaleziono pętli opcji”.

Thomas King
źródło
Użyj quicktime 7 pro i przenieś kontener. Więc nie dostaniesz większego rozmiaru pliku niż w przypadku opensource.
Дмитрий Мышков

Odpowiedzi:

69

Demultiplekser Concat

Pozwala to na zapętlenie wejścia bez potrzeby ponownego kodowania.

  1. Utwórz plik tekstowy. Zawartość przykładowego pliku tekstowego do powtórzenia 4 razy.

    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    file 'input.mp4'
    
  2. Następnie uruchom ffmpeg:

    ffmpeg -f concat -i list.txt -c copy output.mp4
    

Dla użytkowników systemu Linux

Ten przykład jest taki sam jak powyżej, ale nie musisz ręcznie robić list.txt:

for i in {1..4}; do printf "file '%s'\n" input.mp4 >> list.txt; done
ffmpeg -f concat -i list.txt -c copy output.mp4

Dzięki najczęściej używanym nowoczesnym powłokom możesz nawet list.txtcałkowicie uniknąć tworzenia pliku. Na przykład za pomocą bash:

ffmpeg -f concat -i <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -c copy output.mp4

Zobacz także:


filtr pętli

Przykład użycia filtra pętli do zapętlenia 4 razy, każda pętla ma 75 klatek, każda pętla pomija pierwsze 25 klatek wejścia:

ffmpeg -i input -filter_complex loop=loop=3:size=75:start=25 output
  • Lub użyj skrótu: loop=3:75:25
  • Filtrowanie wymaga ponownego kodowania.
  • Ten filtr umieszcza wszystkie ramki w pamięci .
  • Korzystanie loop=3zapętli się 4 razy.
  • Do nieskończonej pętli użyj -1.
  • Musisz podać liczbę ramek do zapętlenia (pokazane jako 75 w powyższym przykładzie). Maksymalna wartość to 32767.
  • Zobacz także ffmpeg -h filter=loop.

filtr filmu

Filtr film posiada opcję pętli. Zobacz odpowiedź poniżej autorstwa Monah Tuk. Filtrowanie wymaga ponownego kodowania. Do audio użyj filtra amovie.


-stream_loop opcja

Zobacz odpowiedź poniżej Thingy i odpowiedź Gyana .

Zauważ, że ta opcja była błędna (patrz raporty o błędach # 5719 , # 6121 i # 7043 ), więc może nie działać w przypadku starszych wersji (cokolwiek starszego niż 06-27 2018, w tym gałąź wydania FFmpeg 4.0.x). Dla użytkowników starych kompilacji, jak wspomniano przez Mulvya w bilecie nr 6121, jednym z obejść jest najpierw ponowne zmiksowanie do MKV lub TS, a następnie użycie -stream_loopw następnym poleceniu.


-loop opcja

Ta -loopopcja jest specyficzna dla demuxera plików obrazu i gif muxera , więc nie można jej używać do typowych plików wideo, ale można jej używać do nieskończonej pętli serii obrazów wejściowych. Ten przykład będzie się powtarzał w kółko, ale -t 30ograniczy czas trwania wyjścia do 30 sekund:

ffmpeg -loop 1 -i %03d.png -t 30 output.mkv

Lub zapętlić wyjście GIF:

ffmpeg -i input -loop 3 output.gif
Llogan
źródło
Czy to działa dobrze z plikami MP4?
Thomas King
3
Otrzymuję ten błąd> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
JZ11
1
@jamesfzhang - Myślę, że to dlatego, że potrzebujesz bezwzględnej ścieżki do pliku (jak wyjaśniono tutaj: trac.ffmpeg.org/wiki/Concatenate ). Aby to zrobić, możesz napisać: ffmpeg -safe 0 -f concat -i <(dla i w {1..4}; do printf "plik '$ PWD' / '% s' \ n" input.mp4; gotowe ) -c copy output.mp4
Plenus Franckly
1
Jak dla mnie to działa, aby powtórzyć wideo w pełnym wymiarze godzin bez pomijania sławy 4 razyffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
Vlad
Ten numer ma 4 lata i nikt nie zauważył, że link do drugiego numeru w -stream_loopsekcji wskazuje ten sam bilet jak pierwszy ...
Leonid Usov
15

Przynajmniej na FFmpeg 2.8.x (ale oldie też powinno działać) możesz użyć lavfijako formatu wejściowego i wykresu złożonego filtru używając moviei setptsfiltrów jako argumentu za -iopcją.

Następne polecenie wykonujące tę pracę dla Ciebie:

ffmpeg -re -f lavfi -i "movie=filename=input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" output.mp4

Zero loop=argumentów oznacza pętlę nieskończoności. Wartości większe zero ustawiają liczby powtórzeń. setptsfiltry wymagane do regulacji PTS dla drugiego i późniejszych powtórzeń, w przeciwnym razie większość multiplekserów wyjściowych zawiedzie z nie-monotonicznym wzrostem PTS: pętla nie przelicza PTS.

Zauważ, że stosowanie filtrów zakładających, że pomijanie ramek bez dekodowania / kodowania jest niemożliwe: filtry według projektu dotyczą tylko zdekodowanych ramek.

W FFmpeg 2.8.2 wprowadzono nową opcję -stream_loopwprowadzania. Najpierw wyglądam, że działa prostiej i pozwala na kopiowanie treści bez transkodowania:

ffmpeg -re -stream_loop -1 -i input.mp4 -c copy -y output.mp4

Ale nie oblicza ponownie PTS, a plik wyjściowy jest nieprawidłowy. Jeśli dodasz filtr, aby naprawić PTS (patrz setpts), musisz -c copyrównież usunąć . Tylko filtry strumienia bitów mogą obsługiwać zakodowane pakiety, ale nie ma żadnych filtrów strumienia bitów do naprawy PTS (patrz: https://ffmpeg.org/ffmpeg-bitstream-filters.html )

W każdym przypadku ffmpeg przy drugim przejściu nie powiedzie się z błędem:

input.mp4: Resource temporarily unavailable

Znane mi rozwiązanie : użyj kontenera do pliku wejściowego bez limitów PTS (kontener strumieniowy). Jednym z nich, znanym mi, jest MPEG-TS. Możesz więc łatwo przekonwertować plik MP4 na MPEG-TS:

ffmpeg -i input.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts input.ts

I użyj następnego polecenia, aby utworzyć plik nieskończoności:

ffmpeg -re -stream_loop -1 -i input.ts -c copy -strict -2 -bsf:a aac_adtstoasc -y output.mp4

(filtry strumienia bitów powinny być używane tylko w razie potrzeby, na moich próbkach jest to wymagane)

W tym przypadku wymagany jest FFmpeg> = 2.8.2.

Monah Tuk
źródło
1
Uruchomienie tego polecenia powoduje błąd: „[mp4 @ 00000000053fa1a0] Nie można znaleźć tagu dla surowego wideo kodeku w strumieniu # 0, kodek nie jest obecnie obsługiwany w kontenerze”. Jeśli dodam -vcodec h264 przed wejściem, ten błąd znika, ale koder nie wychodzi. Podanie niezerowej liczby pętli powoduje wiele błędów, ale powoduje zakończenie. Plik nie jest prawidłowym wyjściem.
Gyan,
1
Dokumentacja dla stream_loop mówi: „Pętla 0 oznacza brak pętli, pętla -1 oznacza pętlę nieskończoną”.
Gyan,
Wydaje się nieprawidłowe pliki wejściowe. Czy mógłbyś się tym podzielić? „Pętla 0 oznacza brak pętli, pętla -1 oznacza pętlę nieskończoną”. - wydaje się, że widzę stare dokumenty :-)
Monah Tuk
1
Zapomniałem: filtry zakładające transkodowanie (dekodowanie / kodowanie). Przez projekt. Więc musisz usunąć -c copy. Odpowiedź naprawiona.
Monah Tuk,
1
Dobrze wiedzieć, ale jest to znaczące ograniczenie, jeśli masz dużą pętlę do wygenerowania.
Gyan
14

W wersji ffmpeg 2.8.4 następujące polecenie tworzy output.mp4, który jest powtarzalną kopią input.mp4, aż do zatrzymania procesu ffmpeg:

ffmpeg -stream_loop -1 -i input.mp4 -c copy output.mp4

To polecenie nie zakończy się samo, a plik wyjściowy będzie się powiększał nieskończenie.

Thingy
źródło
2
Wydaje się, że jest to najszybsza metoda
josef
2
Najszybsza metoda to mało powiedziane, ta metoda pozwala na nagranie wielu godzin filmów w ciągu kilku sekund.
SleighBoy
Jest to bardzo wygodna metoda, ponieważ nie ma potrzeby tworzenia pliku z powtarzającymi się liniami.
Markus Zeller
-1

P: „... jak mogę zmienić następujący wiersz poleceń? Ffmpeg -i input.mp4 -c copy output.mp4”?

Odp .: Prosta metoda pozwalająca uniknąć problemów, z którymi Polecenia działają, z którą wersją jest „trywialnym rozwiązaniem”:

ffmpeg -i input.mp4 -i input.mp4 -i input.mp4 -i input.mp4 -c skopiować wyjście.mp4

Zobacz także: https://trac.ffmpeg.org/wiki/Concatenate dla wielu przykładów.

Obrabować
źródło
2
To nie powoduje żadnego konkatenacji. Należy zastosować co najmniej jedną z metod konkat: protokół, filtr lub demultiplekser. W tym poleceniu automatyczne mapowanie ffmpeg wybierze spośród wejść jeden strumień wideo, jeden dźwięk i jeden napisy. Ponieważ są identyczne, odpowiada to pierwszemu poleceniu PO.
Gyan,
Dziękujemy za przetestowanie tego Mulvya, ponieważ różni się on od zachowania opisanego w Dokumentach: ffmpeg.org/ffmpeg.html#Description - Jeśli istnieje podobieństwo w nazwach plików przy użyciu „-i -i /tmp/test%d.mp4” ( i in.) jest również możliwe.
Rob