2014-12-19 12 views
42

Istnieje wiele samouczków i materiałów pokazujących, jak wyodrębnić wiele zrzutów ekranu z filmu za pomocą ffmpeg. Ustawić -R i można nawet rozpocząć pewną kwotę w.Jak wyodrębnić 1 zrzut ekranu dla wideo za pomocą ffmpeg w określonym czasie?

Ale ja po prostu chce 1 Zrzut ekranu na, powiedzmy 01:23:45 w. Lub 1 zrzut ekranu na 86% w.

To wszystko jest możliwe z ffmpegthumbnailer, ale jest to kolejna zależność, na której nie chcę polegać. Chcę móc to zrobić za pomocą ffmpeg.

Odpowiedz

85

Użyj opcji -ss:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg 
  • JPEG użytku wyjściowego -q:v do kontroli jakości produkcji. Pełny zakres to skala liniowa od 1 do 31, gdzie niższa wartość daje wyższą jakość. 2-5 to dobry zasięg do wypróbowania.

  • select filter zapewnia alternatywny sposób bardziej złożonych potrzeb, takich jak wybór tylko niektóre typy ramek, lub 1 na 100 itp

  • Umieszczenie -ss zanim wkład będzie szybsze. Zobacz FFmpeg Wiki: Seeking i ten fragment z ffmpeg cli tool documentation:

-ss pozycji (wejścia/wyjścia)

Kiedy stosowany jako opcja wejściowego (przed -i), zmierza w tym pliku wejściowego do pozycji. Zauważ, że w większości formatów nie można dokładnie wyszukać , więc ffmpeg będzie szukał najbliższego punktu przeszukiwania przed pozycją . Kiedy transkodowanie i -accurate_seek jest włączone (domyślnie ), ten dodatkowy segment między punktem przeszukiwania i pozycją zostanie zdekodowany i odrzucony jako . Podczas korzystania z funkcji kopiowania strumieniowego lub korzystania z funkcji -noaccurate_seek zostanie ona zachowana.

W przypadku użycia jako opcji wyjściowej (przed nazwą pliku wyjściowego) dekoduje, ale odrzuca dane wejściowe, dopóki znaczniki czasu nie osiągną pozycji.

pozycja może być w sekundach lub w formularzu hh:mm:ss[.xxx].

+0

To jest DUŻO szybsze. Dziękuję bardzo. Umieszczenie znaku -ss pierwszy robi ogromną różnicę. –

+0

Użycie -ss przed -i może spowodować artefakty. Przesunięcie -ss do wyjścia rozwiązało to dla mnie, ale było zauważalne wolniej. – hirschhornsalz

+0

Czy istnieje sposób na uzyskanie n-tej klatki po określonym czasie? – dorien

16

FFMpeg Można to zrobić poprzez dążenie do podanego znacznika czasu i wyodrębnianie dokładnie jedną klatkę jako obraz, patrz na przykład:

ffmpeg -i input_file.mp4 -ss 01:23:45 -vframes 1 output.jpg 

Wyjaśnijmy opcje:

-i input file   the path to the input file 
-ss 01:23:45   seek the position to the specified timestamp 
-vframes 1    only handle one video frame 
output.jpg    output filename, should have a well-known extension 

Parametr -ss akceptuje wartość w postaci HH:MM:SS[.xxx] lub jako liczba w sekundach. Jeśli potrzebujesz wartości procentowej, musisz wcześniej obliczyć czas trwania wideo.

+0

Wydaje się działać zgodnie z oczekiwaniami. Obecnie testuję porównując, jeśli jest to ta sama szybkość, co przy użyciu ffmpegthumbnailer. –

+0

Tak, to podejście jest bardzo powolne. Zobacz http: //www.peterbe.com/plog/najszybszy sposób na zrobienie-screencaps-out-of-videos –

+3

spróbuj użyć opcji -ss przed -i, ponieważ pominie część dekodowania potoku. To może przyspieszyć proces. – SirDarius