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”.
Odpowiedzi:
Demultiplekser Concat
Pozwala to na zapętlenie wejścia bez potrzeby ponownego kodowania.
Utwórz plik tekstowy. Zawartość przykładowego pliku tekstowego do powtórzenia 4 razy.
Następnie uruchom
ffmpeg
:Dla użytkowników systemu Linux
Ten przykład jest taki sam jak powyżej, ale nie musisz ręcznie robić
list.txt
:Dzięki najczęściej używanym nowoczesnym powłokom możesz nawet
list.txt
całkowicie uniknąć tworzenia pliku. Na przykład za pomocą bash: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:
loop=3:75:25
loop=3
zapętli się 4 razy.-1
.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
opcjaZobacz 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_loop
w następnym poleceniu.-loop
opcjaTa
-loop
opcja 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 30
ograniczy czas trwania wyjścia do 30 sekund:Lub zapętlić wyjście GIF:
źródło
> <(for i in {1..4}; do printf "file '%s'\n" input.mp4; done) -bash: /dev/fd/63: Permission denied
ffmpeg -i video.mp4 -filter_complex "loop=4:32767" output.mp4
-stream_loop
sekcji wskazuje ten sam bilet jak pierwszy ...Przynajmniej na FFmpeg 2.8.x (ale oldie też powinno działać) możesz użyć
lavfi
jako formatu wejściowego i wykresu złożonego filtru używającmovie
isetpts
filtrów jako argumentu za-i
opcją.Następne polecenie wykonujące tę pracę dla Ciebie:
Zero
loop=
argumentów oznacza pętlę nieskończoności. Wartości większe zero ustawiają liczby powtórzeń.setpts
filtry 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_loop
wprowadzania. Najpierw wyglądam, że działa prostiej i pozwala na kopiowanie treści bez transkodowania:Ale nie oblicza ponownie PTS, a plik wyjściowy jest nieprawidłowy. Jeśli dodasz filtr, aby naprawić PTS (patrz
setpts
), musisz-c copy
ró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:
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:
I użyj następnego polecenia, aby utworzyć plik nieskończoności:
(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.
źródło
-c copy
. Odpowiedź naprawiona.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:
To polecenie nie zakończy się samo, a plik wyjściowy będzie się powiększał nieskończenie.
źródło
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.
źródło