Jak wycinać dokładne klatki za pomocą ffmpeg?

22

Próbuję użyć ffmpeg, aby wyciąć pliki wideo w ściśle określonych momentach. Pomoc ffmpeg pokazuje opcję -timecode_frame_start, aby określić ramkę początkową, ale nie jestem w stanie uruchomić tej komendy. Powstały film zawsze zaczyna się na początku oryginalnego filmu. Oto przykład polecenia, które uruchamiam:

ffmpeg -i input.mpg -acodec copy -vcodec copy -timecode_frame_start 200 -vframes 210 -n ouput.mpg

Przesunąłem opcję timecode_frame_start przed innymi opcjami i po nich, bez zmiany wyników. Czy muszę podać dodatkową opcję? Próbowałem różnych formatów plików, mkv, avi, mp4, i nie wydaje się, że problem jest związany z kodekiem. Oto jeden plik, który próbowałem:

http://www.seaotter.com/marine/movies/hermit-long-01.mpg

Czy coś brakuje?

curmil
źródło
wygląda na to, że odpowiedziano na tę listę mailingową (i należy pamiętać, że z kopią -vcodec nie można „naprawdę” uzyskać cięcia specyficznego dla ramki, ponieważ może ona resynchronizować się tylko w i-ramkach
rogerdpack
@ user39364 Zapytałem na liście mailingowej i okazuje się, że ta opcja nie robi tego, co chce OP. Nauczyłem się również czegoś nowego :)
slhck
Chciałem tylko zauważyć, że znalazłem metodę cięcia przy użyciu dokładnych klatek melt, zobacz Dokładne wycinanie plików wideo z wiersza poleceń - Super Użytkownik
sdaau

Odpowiedzi:

46

Właśnie dowiedziałem się, że timecode_frame_starttak nie działa. Jedynym sposobem na rozpoczęcie od określonych ramek jest konwersja wielu ramek na ss.msskładnię lub hh:mm:ss.ms. Tak więc, jeśli Twój film ma prędkość 25 klatek na sekundę, a chcesz zacząć od 133 klatek, potrzebujesz

133/25 = 5,32

Więc biegnij

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac out.mp4

Należy pamiętać, że wycinanie dokładnych ramek za pomocą funkcji Bitstream Copy ( -c:v copy) nie jest możliwe, ponieważ nie wszystkie ramki są kodowane wewnętrznie i mogą działać samodzielnie.

-ss zawsze będzie dokładny do ramki.

Jeśli chcesz zakodować określoną liczbę ramek, użyj -frames:vna przykład:

ffmpeg -ss 5.32 -i input.mp4 -c:v libx264 -c:a aac -frames:v 60 out.mp4

Możesz także użyć filtrów wideo , ale obsługa dźwięku może nie być dokładna. I najwyraźniej wyszukiwanie na ramkach wciąż nie jest cechą. Możesz śledzić ten wątek listy adresowej użytkowników FFmpeg, aby uzyskać więcej informacji:

możesz użyć -vf selectdo dokładnego wyboru ramki (coś jak -vf 'select=gte(n\,100)'pominięcie 100 pierwszych klatek)

slhck
źródło
3
dla filmów z upuszczanymi ramkami (np. 29,97 kl./s), które trwają ponad 10 minut; jak poszedłbyś o dokładnym obliczeniu czasu dla konkretnej klatki?
GFoley83,
select=gte(n\,100)metoda działa, ale poszukiwanie je się wydajność. Jeśli testujesz, kodując tylko 30 klatek na raz, im dalej w filmie zacznę, tym dłużej trwa ffmpeg z powodu wyszukiwania.
Adam Grant
6

Opcja

-vf select = „pomiędzy (n \, liczba_początkowa \, liczba_końcowa ), setpts = PTS-STARTPTS”
na przykład,

-vf select=“between(n\,200\,300),setpts=PTS-STARTPTS"

tnie wideo z (obejmuje) 200. na (obejmuje) 300. ramkę, liczenie sekwencji rozpoczyna się od 0.

Nuo Chen
źródło