Używam ffmpeg, aby wyciąć fragment dużego pliku, takiego jak ten:
ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv
-ss
Część działa w porządku, ale -t
jest ignorowany. Prawidłowo usuwa początkowe określone sekundy określone za pomocą, -ss
ale następnie przechodzi do końca danych wejściowych z kopią.
Czy istnieje sposób użycia ffmpeg do odcięcia końca filmu bez jego ponownego kodowania?
Odpowiedzi:
Możesz użyć tej
-ss
opcji, aby określić znacznik czasu rozpoczęcia, oraz-t
opcji, aby określić czas trwania kodowania. Znaczniki czasu muszą być wHH:MM:SS.xxx
formacie lub w sekundach (s.msec
).Poniższe spowoduje wycięcie pierwszych 30 sekund, a następnie wycięcie wszystkiego, co nastąpi po 10 sekundach:
Zauważ, że
-t
jest to opcja wyjściowa i zawsze musi być określona po-i
.Kilka porad:
-ss
później-i
, możesz uzyskać dokładniejsze wyszukiwanie kosztem wolniejszego działania. Zobacz także: Szukanie z FFmpegMożna użyć
-to
zamiast-t
określić znacznik czasu, na który chcesz wyciąć. Zamiast tego-i <input> -ss 30 -t 10
możesz zrobić-i <input> -ss 30 -to 40
to samo.Jeśli twój ffmpeg nie obsługuje
-c
lub-to
jest prawdopodobnie bardzo nieaktualny. Skompiluj nową wersję samodzielnie lub pobierz wersję statyczną ze strony głównej. To naprawdę nie jest skomplikowane.źródło
ffmpeg -i input.wmv -c copy -t 35 output.wmv
frame= 150 fps=0.0 q=-1.0 Lsize= 264kB time=00:00:09.97 bitrate= 216.6kbits/s
-c copy
usunęła początkowy czarny ekran, szczegóły patrz jego odpowiedź.Jak wspomnieli inni, stawianie
-ss
przed (znacznie szybciej) lub po (dokładniejszym)-i
robi dużą różnicę. Sekcja „Szybkie i dokładne wyszukiwanie” na stronie wyszukiwania ffmpeg zawiera informacje na temat tego, jak je zdobyć, a ja skorzystałem z niego i to robi dużą różnicę. Zasadniczo stawiasz-ss
przed I po-i
, po prostu upewnij się, że masz wystarczająco dużo czasu przed tym, gdzie chcesz rozpocząć cięcie, aby mieć kolejną klatkę kluczową. Przykład: jeśli chcesz zrobić 1-minutowy klip, od 9min0sek do 10min 0sek w Video.mp4, możesz to zrobić zarówno szybko, jak i dokładnie, używając:Pierwszy
-ss
szuka szybkiego do (w przybliżeniu) 8 minut 0 sekund, a następnie drugi-ss
szuka dokładnie do 9 minut 0 sekund, a następnie-t 00:01:00
pobiera klip 1 minuta.Zwróć też uwagę na ten ważny punkt z tej strony: „Jeśli użyjesz
-ss
z-c:v copy
, wynikowy strumień bitów może skończyć się nierównym, niemożliwym do odtworzenia lub niezsynchronizowanym ze strumieniem audio, ponieważ ffmpeg jest zmuszony używać / dzielenia tylko na i-ramkach. „Oznacza to, że musisz ponownie zakodować film, nawet jeśli chcesz go po prostu skopiować, lub ryzykować, że będzie on przerywany i nie będzie zsynchronizowany. Możesz spróbować
-c copy
najpierw, ale jeśli film jest do bani, musisz to zrobić ponownie.źródło
-c:a copy
tego sposobu poszukiwania.Przekonałem się, że w
-ss
połączeniu z-c copy
początkiem przyniosło pół sekundy.Aby tego uniknąć, musisz usunąć
-c copy
(co wprawdzie wykona transkodowanie).źródło
-c copy
go naprawiło.RĘCZNIE
Otwórz plik w odtwarzaczu multimediów, który będzie klatka po klatce, i odtwórz plik AVISynth z danymi, takimi jak:
Następnie wycinaj w formacie EXACT time:
i
Teraz utwórz plik txt z plikami wideo o treści takiej jak:
Uruchom ffmpeg:
źródło
Dla mnie
-t
opcja nie działała, ale-vframes
działała. Wolę używać#frames
, ponieważ wolę wycinać w I-Frames i odkryłem GOP do używania wideoffprobe
.Linia poleceń, która działała dla mnie to:
Nawiasem mówiąc, umieszczenie
-ss
z przodu-i
ma dużą różnicę w czasie wykonania.źródło
-vframes
(lub-frames:v
) powinno przyjść później,-i
ponieważ jest to opcja wyjściowa.Podobnie jak w przypadku user225366, opcja -t nie działa w przypadku krótkich filmów, ale działa w przypadku dłuższych filmów. W przypadku krótkich filmów wydaje się, że -frames: v jest lepszy. To działało dla mnie.
-Akodec kopia musi zostać dodana, jeśli wideo ma dźwięk, jak pokazują inne odpowiedzi.
źródło
Nie widzę o tym wielu wspominających (nie jestem ekspertem, więc może jest jakiś haczyk), ale jeśli twój plik ma inne strumienie, takie jak napisy i inne metadane, takie jak rozdziały i tak dalej, można wycinać / przycinać i zachować wszystkie strumienie za pomocą następujące polecenie
Z
-map 0
wami podjąć wszelkie strumienie w pliku, a przy-c copy
kopiowaniu wszystkie je takimi jakie są.Użycie
-to
pominięcia startu przez-ss
spowoduje obcięcie wejściowego wideo od początku do drugiego 60.Fiddling
map
przydaje się również wtedy, gdy chcesz zachować tylko określone strumienie w wycięciu (być może nie potrzebujesz wszystkich źródeł audio w pliku lub tylko niektórych napisów).Używam tego, gdy muszę podzielić duże pliki MKV, których nie można zapisać w pamięci FAT32.
źródło