Próbuję usunąć kilka sekcji filmu za pomocą FFmpeg.
Wyobraź sobie na przykład, czy nagrałeś program telewizyjny i chciałeś wyciąć reklamy. Jest to proste dzięki edytorowi wideo GUI; wystarczy zaznaczyć początek i koniec każdego klipu, który ma zostać usunięty, i wybrać opcję usuń. Próbuję zrobić to samo z wiersza polecenia za pomocą FFmpeg.
Wiem, jak przyciąć pojedynczy segment do nowego filmu, tak:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
Skraca to pięciosekundowy klip i zapisuje go jako nowy plik wideo, ale jak mogę zrobić coś przeciwnego i zapisać cały film bez określonego klipu i jak mogę określić wiele klipów do usunięcia?
Na przykład, jeśli moje wideo może być reprezentowane przez ABCDEFG, chciałbym stworzyć nowy, który składałby się z ACDFG.
ffmpeg
video-editing
mp4
Matias
źródło
źródło
Odpowiedzi:
Nadal możesz do tego użyć
trim
filtra. Oto przykład, załóżmy, że chcesz wyciąć segmenty 30-40 sekund (10 sekund) i 50-80 sekund (30 sekund):Co ja tutaj zrobiłem Skróciłem pierwsze 30 sekund, 40-50 sekund i 80 sekund do końca, a następnie połączyłem je w strumień
out1
zconcat
filtrem.O ustawieniach: potrzebujemy tego, ponieważ przycinanie nie modyfikuje czasu wyświetlania obrazu, a gdy wycinamy 10 sekund, licznik dekodera nie widzi żadnych klatek przez te 10 sekund.
Jeśli chcesz także mieć dźwięk, musisz zrobić to samo dla strumieni audio. Zatem polecenie powinno brzmieć:
źródło
Nigdy nie mogę uruchomić rozwiązania ptQa, głównie dlatego, że nigdy nie mogę dowiedzieć się, co oznaczają błędy filtrów i jak je naprawić. Moje rozwiązanie wydaje się trochę dziwniejsze, ponieważ może pozostawić bałagan, ale jeśli wrzucisz go do skryptu, czyszczenie można zautomatyzować. Podoba mi się również to podejście, ponieważ jeśli coś pójdzie nie tak w kroku 4, kończysz kroki 1-3, więc odzyskiwanie po błędach jest nieco bardziej wydajne.
Podstawową strategią jest używanie
-t
i-ss
uzyskiwanie filmów z każdego segmentu, który chcesz, a następnie łączenie wszystkich części w ostateczną wersję.Powiedzmy, że masz 6 segmentów ABCDEF co 5 sekund i chcesz A (0-5 sekund), C (10-15 sekund) i E (20-25 sekund), zrobiłbyś to:
lub
Spowoduje to utworzenie plików a.tvshow, c.tvshow i e.tvshow.
-t
Mówi, jak długo każdy klip jest, więc jeśli c jest 30 sekund długo można przejść w 30 lub 0:00:30. Ta-ss
opcja mówi, jak daleko należy przejść do źródłowego wideo, więc zawsze zależy od początku pliku.Następnie, gdy masz kilka plików wideo, tworzę taki plik
ace-files.txt
:Zanotuj „plik” na początku, a następnie nazwę pliku ucieczki.
Następnie polecenie:
To łączy wszystkie pliki
abe-files.txt
razem, kopiując ich kodeki audio i wideo i tworzy plik,ace.tvshow
który powinien być tylko sekcjami a, c i e. Wtedy po prostu pamiętać, aby usunąćace-files.txt
,a.tvshow
,c.tvshow
ie.tvshow
.Oświadczenie : Nie mam pojęcia, jak (nie) wydajne jest to w porównaniu z innymi podejściami pod względem,
ffmpeg
ale dla moich celów działa lepiej. Mam nadzieję, że to komuś pomoże.źródło
ace-files.txt
w twoim przykładzie) za pomocą:ffmpeg -f concat -i <(printf "file '%s'\n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
Stworzyłem skrypt, aby przyspieszyć edycję nagranej telewizji. Skrypt prosi o godzinę rozpoczęcia i zakończenia segmentów, które chcesz zachować, i dzieli je na pliki. Daje ci opcje, możesz:
Film z tego w akcji: tutaj
Powiedz mi co myślisz.
źródło
safe=0
, tj.ffmpeg -f concat -safe 0 -i ...
Zobacz ffmpeg.org/ffmpeg-all.html#Options-36Mimo że odpowiedź udzielona przez ptQa wydaje się działać, opracowałem inne rozwiązanie, które sprawdziło się dobrze.
Zasadniczo to, co robię, to wyciąć jeden film dla każdej części oryginalnego filmu, który chcę dołączyć do mojego wyniku. Później łączę je z wyjaśnionym tutaj Concat Demuxer .
Rozwiązanie jest takie samo, jak próbowałem najpierw i przedstawiłem problemy z synchronizacją. Dodałem polecenie -avoid_negative_ts 1 podczas generowania różnych filmów. Dzięki temu rozwiązaniu problemy z synchronizacją znikają.
źródło
Dla tych, którzy mają problemy z podejściem ptQa, istnieje nieco bardziej uproszczony sposób. Zamiast łączyć każdy krok na drodze, po prostu wykonaj je wszystkie na końcu.
Dla każdego wejścia zdefiniuj parę A / V:
Zdefiniuj tyle par, ile potrzebujesz, a następnie połącz je wszystkie w jednym przejściu, gdzie n = całkowita liczba wejść.
Można to łatwo zbudować w pętli.
Pełne polecenie wykorzystujące 2 dane wejściowe może wyglądać następująco:
źródło