Wytnij część z pliku wideo od pozycji początkowej do końcowej za pomocą FFmpeg [duplikat]

143

To pytanie ma już odpowiedź tutaj:

Mam plik wideo z 30 minut, ale chcę wyodrębnić film z 00:09:23 do 00:25:33.

Mogę zdefiniować pozycję początkową za pomocą -ss, ale nie mogłem znaleźć pozycji końcowej. Proszę o pomoc?

x74x61
źródło

Odpowiedzi:

244

Zainstaluj ffmpeg

Upewnij się, że pobierasz najnowszą wersjęffmpeg i nie korzystaj z tej, która jest dostarczana z Twoją dystrybucją (np. Ubuntu). Wersje spakowane z różnych dystrybucji są często nieaktualne i nie zachowują się zgodnie z oczekiwaniami.

Lub skompiluj to sam .

Jak wyciąć wideo bez ponownego kodowania

Użyj tego, aby wyciąć wideo [start]dla [duration]:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c copy out.mp4

Tutaj opcje oznaczają:

  • -ssokreśla czas rozpoczęcia, np. 00:01:23.000lub 83(w sekundach)
  • -t określa czas trwania klipu (ten sam format).
  • Ostatnie ffmpegma również flagę do podania godziny zakończenia -to.
  • -c copykopiuje pierwszy strumień bitów wideo, audio i napisów z wejścia do pliku wyjściowego bez ponownego kodowania. Nie zaszkodzi to jakości i sprawi, że polecenie zostanie uruchomione w ciągu kilku sekund.

Jak wyciąć wideo z ponownym kodowaniem

Jeśli pominiesz tę -c copyopcję, ffmpegautomatycznie przekoduje wyjściowy obraz i dźwięk zgodnie z wybranym formatem. Aby uzyskać wysokiej jakości obraz i dźwięk, przeczytaj odpowiednio Przewodnik kodowania x264 i Podręcznik kodowania AAC .

Na przykład:

ffmpeg -ss [start] -i in.mp4 -t [duration] -c:v libx264 -c:a aac -strict experimental -b:a 128k out.mp4
slhck
źródło
1
W Ubuntu 12:10, -c: v i -c: a nie działało. Musiałem zamiast tego użyć opcji „-acodec copy i -vcodec copy”.
Samuel Lampa
1
@Samuel Następnie używasz przestarzałej wersji, która nie jest nawet prawdziwym FFmpeg, ale widelcem Libav. Zobacz: stackoverflow.com/a/9477756/1109017
slhck
Dzięki za to! jeśli nie określisz czasu trwania, czy będzie on trwał do końca?
Jeff
@Jeff Tak! (minimum postaci)
slhck
3
@Prateek Podczas kopiowania strumienia bitów wideo (zamiast ponownego kodowania) można wycinać tylko w klatkach kluczowych . Jeśli są klatki kluczowe w sekundach 1, 2 i 3, ale chcesz wyciąć w drugiej 1,5, to ffmpeg poczeka do drugiej 2, zanim będzie mógł rozpocząć cięcie. To sprawia, że ​​jest niedokładny.
slhck,
26

Myślę, że możesz teraz użyć następującego polecenia.

ffmpeg -i inputFile -vcodec copy -acodec copy -ss 00:09:23 -to 00:25:33 outputFile

Zobacz także ffmpeg Doc lub tę stronę wiki .

sflee
źródło
6
ffmpeg -i inputFile -c copy -ss 00:09:23 -to 00:25:33 outputFileprostsza wersja
nwgat
3
Musiałem użyć ffmpeg -ss 00:01:00 -i video.mp4 -to 00:02:00 -c copy -copyts cut.mp4wersji (z -copyts), w przeciwnym razie niepoprawnie go wyciął (z czarnym ekranem na początku). Dzięki za drugi link.
Necronomicron
To świetnie, ostatnią rzeczą, której chciałem, było obliczenie czasu trwania z punktów końcowych.
Tomasz Gandor
Opcja -to odpowiada na faktycznie zadane pytanie. Reszta odpowiedzi jest albo bezczelna, albo przestarzała.
James Bowery
12

Dziwne, że nikt nie sugerował trim filtra .

Usuń wszystko oprócz drugiej minuty wprowadzania:

ffmpeg -i INPUT -vf trim=60:120

Zachowaj tylko pierwszą sekundę:

ffmpeg -i INPUT -vf trim=duration=1

Upuść wszystko oprócz drugiego 13 do drugiego 58:

ffmpeg -i INPUT -vf trim=13:58 OUTPUT
malat
źródło
8
Tak, dobrze wspomnieć trimi atrim. Zwykle używam ich podczas filtrowania, ale użytkownicy powinni pamiętać, że filtrowanie wymaga ponownego kodowania .
llogan,
Jesteś moim bohaterem. Bardzo potrzebowałem filtra, który to zrobił.
fahadash
5

Możesz użyć tych dwóch metod, które działają w systemach Windows i Linux.

Istnieją dwa sposoby dzielenia plików wideo przez ffmpeg. Pierwszy jest dobry sam w sobie, co więcej - jest szybszy, ale czasami tworzy pliki wyjściowe z pewnymi wadami. Tak więc w tych przypadkach istnieje drugi sposób dzielenia plików wideo: jest znacznie wolniejszy, pliki wyjściowe są większe, ale wydaje się, że zawsze mają ten sam poziom jakości co używane pliki wejściowe.

Sposób 1:

ffmpeg -ss <start> -i in1.avi -t <duration> -c copy out1.avi

Sposób 2:

ffmpeg -ss <start> -i in1.avi -t <duration> out1.avi
  • <start>- początek części filmu ffmpeg ma zostać wycięty. Format:, 00:00:00.0000co oznacza godziny: minuty: sekundy: milisekundy.

  • <duration>- czas trwania części filmu ffmpeg ma zostać wycięty. Taki sam format jak powyżej.

Przykłady:

ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 -c copy out1.avi
ffmpeg -ss 01:19:00 -i in1.avi -t 00:05:00 out1.avi

ffmpeg wycina część pliku wideo, zaczynając od 1 godziny 19 minut 0 sekund. Czas wycinania sekwencji wideo wynosi 5 minut 0 sekund.

Christian Wörz
źródło
Ok, dzięki. Sprawdzę dokumenty i spróbuję jutro.
juGGaKNot
3
-sameqnie oznacza „tej samej jakości” i został usunięty z ffmpeg. Użyj -codec copyzamiast tego. Nie zapomnij również o tej -toopcji.
llogan
Poprawiłem polecenia w twoim cytacie, ponieważ były one dość nieaktualne. Nie kopiuj i wklejaj informacji bez odpowiedniego ich cytowania.
slhck
-1

Możesz tego użyć

ffmpeg -sameq -ss clip_start -t duration  -i  original.ogg  clip.ogg

Tutaj musisz podać czas trwania wideo. to znaczy. 00: 25: 33-00: 09: 23

daya
źródło
1
Jak wspomniałem w drugiej odpowiedzi: Za pomocą polecenia ponownie kodujesz plik, co absolutnie nie jest konieczne i powoduje obniżenie jakości i wydłużenie czasu przetwarzania.
slhck 11.01.12
-2

Używam następującej składni do cięcia wideo za pomocą ffmpef:

ffmpeg -sameq -ss [start_seconds] -t [duration_seconds] -i [input_file] [outputfile]

-t służy do ustawiania czasu trwania w sekundach - nie można określić godziny zakończenia, ale powinno to działać dla Ciebie.

Michael Banzon
źródło
1
Dlaczego ustawiasz FFmpeg na ponowne kodowanie pliku? Pamiętaj, że -sameqwcale nie oznacza to „tej samej jakości”.
slhck 11.01.12