2010-05-06 14:12:17 +0000 2010-05-06 14:12:17 +0000
357
357
Advertisement

Używam ffmpeg do cięcia wideo

Advertisement

Używam ffmpeg do wycinania fragmentu dużego pliku w następujący sposób:

ffmpeg -i input.wmv -ss 60 -t 60 -acodec copy -vcodec copy output.wmv

Część -ss działa dobrze, ale -t jest ignorowany. Prawidłowo usuwa ona początkowe określone sekundy określone przez -ss, ale następnie przechodzi na koniec wejścia z kopią.

Czy jest jakiś sposób, aby za pomocą ffmpeg odciąć koniec filmu bez jego przekodowania?

Advertisement

Odpowiedzi (7)

105
105
105
2014-01-20 04:07:24 +0000

Jak wspominali inni ludzie, umieszczenie -ss przed (znacznie szybciej) lub po (dokładniej) -i robi dużą różnicę. Sekcja “Szybkie i dokładne wyszukiwanie” na stronie wyszukiwania ffmpeg mówi ci, jak uzyskać oba, a ja już z niego korzystałem i robi to dużą różnicę. Zasadniczo umieściłeś -ss przed i po -i, po prostu upewnij się, że zostawiłeś wystarczająco dużo czasu przed tym, gdzie chcesz zacząć ciąć, aby mieć kolejną ramkę na klucze. Przykład: Jeśli chcesz zrobić 1-minutowy klip, od 9min0sec do 10min 0sec w Video.mp4, możesz to zrobić zarówno szybko jak i dokładnie używając:

ffmpeg -ss 00:08:00 -i Video.mp4 -ss 00:01:00 -t 00:01:00 -c copy VideoClip.mp4

Pierwszy -ss szuka szybko do (około) 8min0sec, a następnie drugi -ss szuka dokładnie do 9min0sec, a -t 00:01:00 wyjmuje 1min0sec klip.

Zwróć również uwagę na ten ważny punkt z tej strony: “Jeśli użyjesz -ss z -c:v copy, wynikowy strumień bitów może być rozszczepialny, nie nadający się do odtwarzania lub nie zsynchronizowany ze strumieniem audio, ponieważ ffmpeg jest zmuszony do używania/rozszczepiania tylko na i-frame”

Oznacza to, że musisz ponownie zakodować wideo, nawet jeśli chcesz je tylko skopiować, lub ryzykujesz, że będzie rozszczepialne i nie będzie zsynchronizowane. Możesz najpierw spróbować tylko -c copy, ale jeśli film jest do bani, musisz go zrobić ponownie.

27
27
27
2014-05-09 02:24:58 +0000

Stwierdziłem, że -ss w połączeniu z -c copy zaowocowało półsekundowym cięciem na starcie.

Aby tego uniknąć, trzeba usunąć -c copy (co wprawdzie zrobi transkodę).

13
Advertisement
13
13
2014-09-04 05:48:57 +0000

MANUALLY

Otwórz plik w odtwarzaczu multimedialnym, który będzie klatka po klatce i odtwórz plik AVISynth z danymi takimi jak:

DirectShowSource(("C:\Downloads\Video\Do you want him.flv"), Pixel_Type="yuy2").Crop(0,0,-0,-0)
Subtitle("C:\Downloads\Video\Do you want him.flv", font="Arial", size=24, text_color=$ff0000, align=3)
ShowFrameNumber(scroll=true, x=336, y=27, font="Arial", size=24, text_color=$ff0000)
ShowTime(x=398, y=44, font="Arial", size=24, text_color=$ff0000)

Następnie wytnij w formacie EXACT time:

ffmpeg -i "Path\do you want him.flv" \
       -ss 00:00:05.240 -to 00:00:08.360 \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him1.flv"

i

ffmpeg -i "Path\do you want him.flv" \
       -ss 00:00:10.240 -to 00:00:14.360 \
       -vcodec libx264 -acodec libvo_aacenc \
       "Path\Do you want him2.flv"

Teraz zrób plik txt z plikami wideo o zawartości takiej jak:

file 'C:\Downloads\Video\Do you want him1.flv'
file 'C:\Downloads\Video\Do you want him2.flv'

Uruchom ffmpeg:

ffmpeg -f concat -i FileList.txt -c copy "Path\NewName_joined.flv"
8
8
8
2013-05-19 03:14:56 +0000

Dla mnie opcja -t nie zadziałała, ale -vframes zadziałało. Wolę używać #frames, ponieważ wolałbym ciąć na I-ramkach i odkryłem GOP dla wideo używając ffprobe.

Linia komend, która zadziałała dla mnie to:

ffmpeg -ss 60s -i input.wmv -vframes 1800 -acodec copy -vcodec copy output.wmv

Przy okazji, umieszczenie -ss z przodu -i robi dużą różnicę w czasie wykonania.

5
Advertisement
5
5
2016-12-08 11:24:57 +0000

Podobnie jak w przypadku użytkownika225366, opcja -t nie działa w przypadku krótkich filmów, ale w przypadku dłuższych filmów. Dla krótkich filmów wideo wydaje się, że -frames:v jest lepsze. To jest to, co działa dla mnie.

ffmpeg -ss 4 -i input.mp4 -frames:v 200 -vcodec copy output.mp4

-acodec kopia musi być dodana, jeśli film ma audio, jak pokazują inne odpowiedzi.

0
0
0
2020-02-12 02:20:00 +0000

użyj tego formatu:

ffmpeg <start time> <input file> <cut duration> <out file>

np. wytnij 60 sekundowy klip po 1 minucie wideo

ffmpeg.exe -ss 00:01:00 -i "in file.mp4" -to 00:01:00 -c copy out.mp4

0
Advertisement
0
0
2019-09-01 05:29:02 +0000

Niewiele o tym wspominam (nie jestem ekspertem, więc może jest jakiś haczyk), ale jeśli twój plik ma inne strumienie jak napisy i inne metadane jak rozdziały i tak dalej, możliwe jest wycięcie/wycięcie i utrzymanie wszystkich strumieni za pomocą komendy

ffmpeg -to 60 -i input.mkv -map 0 -c copy output.mkv

Z -map 0 bierzesz wszystkie strumienie w pliku, a z -c copy kopiujesz je wszystkie tak jak są.
Użycie -to pomijając start przez -ss spowoduje wycięcie obrazu wejściowego od początku do drugiej 60.

Skrócenie do map jest użyteczne także wtedy, gdy chcemy zachować w wycięciu tylko określone strumienie (może nie potrzebujemy wszystkich źródeł audio w pliku, albo tylko kilka napisów).

Używam tego, gdy muszę podzielić duże pliki MKV, które nie mogą być przechowywane w pamięci FAT32.

Advertisement
Advertisement