Як витягти 1 скріншот для відео з ffmpeg за певний час?


109

Існує багато навчальних посібників та матеріалів, які показують, як витягти декілька скріншотів із відео за допомогою ffmpeg. Ви встановлюєте -r і навіть можете запустити певну суму в.

Але я просто хочу 1 скріншот на, скажімо, 01:23:45 дюйма. Або 1 скріншот зі 86% дюйма.

Це все можливо за допомогою ffmpegthumbnailer, але це ще одна залежність, від якої я не хочу залежати. Я хочу мати змогу це зробити з ffmpeg.

Відповіді:


208

Скористайтеся -ssопцією:

ffmpeg -ss 01:23:45 -i input -vframes 1 -q:v 2 output.jpg
  • Для виведення JPEG використовуйте -q:vдля контролю якості вихідних даних. Повний діапазон - це лінійна шкала 1-31, де нижча величина призводить до більш високої якості. 2-5 - хороший діапазон для спробу.

  • Вибрати фільтр забезпечує альтернативний метод для більш складних потреб , таких як вибір тільки для певних типів кадрів, або 1 на 100, і т.д.

  • Розміщення -ssперед входом буде швидше. Див. FFmpeg Wiki: Пошук та цей уривок із ffmpegдокументації щодо інструменту cli :

-ss позиція (вхід / вихід)

Якщо використовується як параметр введення (раніше -i), у цьому вхідному файлі шукає позицію. Зверніть увагу, що в більшості форматів не можна точно шукати, тому ffmpegбуде шукати до найближчої точки пошуку до позиції. Коли перекодування та -accurate_seekввімкнено (за замовчуванням), цей додатковий відрізок між точкою пошуку та позицією буде декодований та відкинутий. При виконанні потокової копії або при -noaccurate_seekвикористанні вона буде збережена.

Якщо використовується як параметр виводу (перед назвою файлу виводу), декодує, але відкидає введення, поки часові позначки не досягнуть положення.

положення може бути або в секундах, або у hh:mm:ss[.xxx]формі.


2
Це набагато швидше. Дуже дякую. Поставлення -ss спочатку має величезну зміну.
Пітер Бенгтссон

чи є спосіб отримати n-й кадр після зазначеного часу?
доріен

@GuntherPiez я не бачу жодної згадки про можливі артефакти.
Стефан Рейх

2
Зауважимо, що vframesзастаріла в (принаймні) версії 4.2.2. У посібнику "[ vframes] - це застарілий псевдонім для" -frames:v", який слід використовувати замість цього."
Синексис

Працює ідеально і швидко.
Smeterlink

37

FFMpeg може це зробити, звернувшись до заданої часової позначки та витягнувши рівно один кадр у вигляді зображення, див. Наприклад:

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

Пояснимо варіанти:

-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

-ssПараметр приймає значення в формі HH:MM:SS[.xxx]або у вигляді числа в секундах. Якщо вам потрібен відсоток, потрібно заздалегідь обчислити тривалість відео.


Здається, працює так, як очікувалося. Наразі я орієнтовний, якщо це така ж швидкість, як і використання ffmpegthumbnailer.
Пітер Бенгтссон

Так, такий підхід дуже повільний. Дивіться peterbe.com/plog/fastest-way-to-take-screencaps-out-of-videos
Пітер Бенгтссон

7
спробуйте скористатися опцією -ss до -i, оскільки вона пропустить декодуючу частину конвеєра. Це може прискорити процес.
SirDarius

1
Чи є спосіб вивести у форматі PNG потік замість файлу?
Нік Манарін

1
@NickeManarin Да .. ffmpeg -ss 01:23:45 -i video.mp4 -c:v png -frames:v 1 image.jpg. Зауважте, що я також ставлю -ssопцію "шукати" перед вхідним файлом у командному рядку, як рекомендували інші.
Гленн Слейден
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.