Próbowałem wyciąć wideo, używając czasu rozpoczęcia i zakończenia wideo, używając następującego polecenia
ffmpeg -ss 00:00:03 -t 00:00:08 -i movie.mp4 -acodec copy -vcodec copy -async 1 cut.mp4
Korzystając z powyższego polecenia, chcę wyciąć wideo z 00:00:03
na 00:00:08
. Ale to nie jest cięcie wideo między tymi czasami, ale to, że tnie wideo z pierwszymi 11 sekundami. czy ktoś może mi pomóc, jak to rozwiązać?
Edycja 1:
Próbowałem wyciąć za pomocą następującego polecenia, które jest sugerowane przez mark4o
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
Ale pokazano następujący błąd.
koder „aac” jest eksperymentalny, ale eksperymentalne kodeki nie są włączone
więc dodałem -strict -2
do polecenia tj.
ffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 -strict -2 cut.mp4
Teraz działa dobrze.
linux
video
ffmpeg
video-editing
Kalai
źródło
źródło
Odpowiedzi:
Prawdopodobnie nie masz klatki kluczowej na 3 sekundowym znaku. Ponieważ klatki inne niż klatki kluczowe kodują różnice w stosunku do innych klatek, wymagają one wszystkich danych, zaczynając od poprzedniej klatki kluczowej.
W kontenerze mp4 możliwe jest cięcie bez klatki kluczowej bez ponownego kodowania przy użyciu listy edycji. Innymi słowy, jeśli najbliższa klatka kluczowa przed 3s ma wartość 0, skopiuje wideo zaczynając od 0 i użyje listy edycji, aby powiedzieć graczowi, aby zaczął odtwarzać 3 sekundy.
Jeśli używasz najnowszej wersji ffmpeg od git master, zrobi to za pomocą listy edycji po wywołaniu za pomocą podanego polecenia. Jeśli to nie działa, prawdopodobnie używasz starszej wersji ffmpeg lub twój odtwarzacz nie obsługuje list edycji. Niektóre odtwarzacze zignorują listę edycji i zawsze odtwarzają wszystkie multimedia w pliku od początku do końca.
Jeśli chcesz wycinać dokładnie zaczynając od klatki kluczowej i chcesz, aby grała od wybranego miejsca na odtwarzaczu, który nie obsługuje list edycji, lub chcesz upewnić się, że wycięta część nie znajduje się w pliku wyjściowym (na przykład jeśli zawiera poufne informacje), możesz to zrobić, ponownie kodując, aby klatka kluczowa była dokładnie w żądanym czasie rozpoczęcia. Ponowne kodowanie jest domyślne, jeśli nie zostanie określone
copy
. Na przykład:Podczas ponownego kodowania możesz również chcieć uwzględnić dodatkowe opcje związane z jakością lub określony koder AAC. Aby uzyskać szczegółowe informacje, zobacz Podręcznik kodowania x264 ffmpeg dla wideo i Podręcznik kodowania AAC dla audio.
Ponadto
-t
opcja określa czas trwania, a nie czas zakończenia. Powyższe polecenie zakoduje 8 s wideo zaczynając od 3 s. Aby rozpocząć od 3s i zakończyć od 8s użyj-t 5
. Jeśli używasz aktualnej wersji FFmpeg można również wymienić-t
ze-to
w powyższym poleceniu do końca w określonym czasie.źródło
-t
/-to
i jego argument, aby przejść do końca.-ss
PRZED plikiem wejściowym (wcześniej-i
), ponieważ w ten sposób ffmpeg przejdzie bezpośrednio do lokalizacji. Spowoduje to jednak również ustawienie czasu „zero” w tej lokalizacji, co oznacza, że-to
wskaże niewłaściwy czas. Źródło: trac.ffmpeg.org/wiki/Seekingffmpeg -i movie.mp4 -ss 00:00:03 -t 00:00:08 -async 1 cut.mp4
pojawia się problem z synchronizacją dźwięku i obrazu , chociaż w oryginalnym pliku nie ma takiego problemu.-async 1
.Spróbuj użyć tego. Jest to najszybszy i najlepszy sposób, w jaki udało mi się to ustalić:
To polecenie przycina wideo w kilka sekund!
Wyjaśniłem to na moim blogu tutaj :
Format czasu to: hh: mm: ss
Należy pamiętać, że obecna bardzo pozytywna odpowiedź jest nieaktualna, a przycinanie byłoby bardzo wolne. Aby uzyskać więcej informacji, spójrz na ten oficjalny ffmpeg artykułem .
źródło
ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -ss 00:01:00 -to 00:02:00 -c copy output.mp4
. Teraz jednak pomijanie jest zepsute, a czas zakończenia jest nieprawidłowy (w moim przypadku).Użyj opcji -c copy, aby zrobić natychmiast. W takim przypadku ffmpeg nie ponownie koduje wideo, po prostu przycina do odpowiedniego rozmiaru.
źródło
ffmpeg -i movie.mkv -vcodec copy -acodec copy converted_movie.mp4
i odwrotnieUpuść wszystko oprócz drugiej sekundy do drugiej 8.
źródło
setpts=PTS-STARTPTS
filtr łańcuchowy za filtrem trymowania.-strict -2
wcześniej dodaćcut.mp4
(w przeciwieństwie do końca wiersza poleceń)?Aby wyciąć na podstawie czasu rozpoczęcia i zakończenia ze źródłowego wideo i uniknąć konieczności wykonywania obliczeń matematycznych, określ czas zakończenia jako opcję wprowadzania, a czas rozpoczęcia jako opcję wyjścia.
Spowoduje to 15-sekundowe cięcie od 0:45 do 1:00.
Dzieje się tak, ponieważ gdy
-ss
podano jako opcję wyjściową, odrzucony czas jest nadal uwzględniany w całkowitym czasie odczytanym z wejścia, który-t
wykorzystuje, aby wiedzieć, kiedy zatrzymać. Jeśli-ss
podano jako opcję wprowadzania , czas rozpoczęcia jest szukany i nie jest liczony , stąd pochodzi zamieszanie.Jest wolniejszy niż wyszukiwanie, ponieważ pominięty segment jest przetwarzany przed jego odrzuceniem, ale o ile wiem, jest to jedyny sposób, aby to zrobić. Jeśli przycinasz z głębi dużego pliku, rozsądniej jest po prostu wykonać matematykę i użyć
-ss
danych wejściowych.źródło
Oto, czego używam:
Wygenerowane
mp4
pliki można również wykorzystać wiMovie
.Odniesienie: https://www.arj.no/2018/05/18/trimvideo
Jeśli chcesz połączyć wiele scen przerywników, możesz użyć następującego skryptu:
źródło
Użyj -to zamiast -t: -to określa czas zakończenia, -t określa czas trwania
źródło
Chociaż jestem spóźniony 6 lat, ale myślę, że wszystkie powyższe odpowiedzi nie odnoszą się do pytania, które zadaje @kalai . Poniższy skrypt bash przetworzy plik tekstowy w następującym formacie:
na przykład
i pętli pliku, pobiera plik, który
youtube-dl
podporach, obliczania czasu trwania pomiędzystart_time
aend_time
i przepuszczenie goffmpeg
, ponieważ-t
jest rzeczywiście czas trwania , a nie prawdziweend_time
Uderz mnie, jeśli masz jakieś pytanie.
źródło