Як витягти один кадр відео кожні N секунд до зображення?


71

Як можна конвертувати відеофайл у послідовність зображень, наприклад, один кадр кожні N секунд. Чи може це зробити mplayer або ffmpeg? Я використовував MPlayer, щоб збирати скріншоти вручну, але я хотів би автоматизувати це для тривалого відео.


Дивіться це пов’язане питання щодо вибору якості зображень: stackoverflow.com/questions/10225403/…
Pierz

Відповіді:


70

З ffmpeg це дуже просто, і він може виводити один кадр кожні N секунд без зайвих сценаріїв. Щоб експортувати як послідовність зображень, просто використовуйте myimage_%04d.pngабо подібну як вихідну. %0xdБіт перетворюється в нулях цілих xчисел довгого - приклад я дав отримує вихідний сигнал , як

  • myimage_0000.png,
  • myimage_0001.png,
  • myimage_0002.png

    тощо.

Ви можете використовувати безліч форматів нерухомих зображень, png, jpeg, tga і будь-що (див. ffmpeg -formatsПовний список).

Ок, тепер ми знаємо, як експортувати фільм як послідовність зображень, але скажемо, що ми не хочемо експортувати кожен кадр?

Трюк полягає в тому, щоб просто змінити частоту кадрів виводу на те, що ми хочемо, використовуючи -r nпараметр, де nкількість кадрів в секунду. 1 кадр в секунду був би -r 1, один кадр кожні чотири секунди -r 0.25, один кадр кожні десять секунд був би -r 0.1і так далі.

Таким чином , щоб поставити все це разом, це те , як це буде виглядати , щоб зберегти один кадр input.movкожні чотири секунди output_0000.png, і output_0001.pngт.д.:

ffmpeg -i input.mov -r 0.25 output_%04d.png

Зверніть увагу , що -r 0.25опція йде після на -i input.movчастини, тому що це контролювати частоту кадрів виведення . Якщо ви поставите його перед введенням, він би ставився до вхідного файлу так, як ніби він має вказану частоту кадрів.

Змініть% xd на скільки потрібних вам цифр, наприклад, якщо команда створить більше 10 000 кадрів, змінити %04dна %05d. Це також працює для вхідних файлів, що є послідовністю зображень. Детальніше читайте тут .

Користувачі Windows : у використанні командного рядка%

приклад: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

У сценаріях CMD та BAT використовується %%

приклад: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

Отже, подвійні %%в сценаріях, і одиничні %в інтерактивному командному рядку. Помилка в будь-якій ситуації призведе до помилки.


Що я повинен вкласти, -rякщо хочу експортувати кожен кадр? Якщо я знаю FPS відео, я вважаю, що я ввожу це, але що робити, якщо я цього не роблю?
Томаш Зато

4
Не використовуйте прапор -r взагалі. Тоді FFMPEG використовуватиме частоту кадрів вхідного файлу.
стиб

2
Зверніть увагу, що ви дійсно хочете використовувати jpegsдля цього, якщо ви не впевнені png, що ви хочете. У моєму випадку jpegs було приблизно 50 кбіт, а pngs - приблизно 2 Мб.
mlissner

5
перевага pngs - стиснення без втрат, тому якщо ви використовуєте послідовність зображень як проміжний і не заперечуєте додатковий розмір, тоді саме тоді ви можете використовувати png.
стиб

Варто додати, що -q:v 1тут дуже корисний варіант, як у superuser.com/questions/318845/…
Микола Шмирев,

27
mplayer -vo jpeg -sstep 5 file.avi

збереже кадр у вигляді файлу jpeg кожні 5 секунд.

Однак він не зупиниться в кінці файлу, він продовжить виробляти копії останнього кадру. Щоб уникнути цього, знайдіть тривалість відео в секундах, використовуючи інший програвач або за допомогою mplayer:

mplayer -vo null -ao null -frames 0 -identify file.avi

і шукайте такий рядок, як "ID_LENGTH = 147,00".

Віднімаємо 2 від довжини і використовуємо це значення для -endposпараметра. Наприклад, для відеозапису 147 секунд:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi

це звучить як помилка mplayer. приємне вирішення.
шарлатаний кіхот

Не могли б ви хоча б згадати, в якій операційній системі ви використовуєте цю команду?
Томаш Зато

Це було 5 років тому, але це був, мабуть, останній робочий стіл Ubuntu того часу, Ubuntu 10.4.
Ліам

Як вибрати крок, менший за 1 секунду. Він приймає лише цілі числа.
fcpenha

На сьогоднішній день mpv --vo=image --sstep=5 movie.mkvчудово працює без згаданої помилки ( mpv - це форк mplayer), використовуючи mpv 0.27.0 на Debian.
Адам Кац

11

З ffmpeg, ви можете зробити наступне:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

Ця команда створює мініатюру формату JPG розміром 320 × 240 на 4-й секунді у відео. Помістіть це в сценарій, який змінює час і ім’я файлу, і ви закінчите.

Додаткова інформація: Створюйте мініатюрне зображення кожні X секунд відео


Це здається робити те, що я хочу, але з однією проблемою. Він буде обробляти файл із самого початку на кожній ітерації, отримуючи експоненціально повільну роботу.
Ліам

@Liam - Чи допоможе це, якщо ви залишите час зміщення в спокої (встановіть його на 1) і використовуйте -ss positionпрапор для пошуку далі у файл? -ss Seek to given time position in seconds. hh:mm:ss[.xxx] syntax is also supported
Ніфле

1
@liam: поставте -ssперед -iтим, щоб пошук стався до того , як вхідне відео стане декодованим. це має прискорити його. source
quack quixote

2
Існує кращий, набагато швидший спосіб зробити це за допомогою ffmpeg. Дивіться мою відповідь нижче.
стиб

Рішення stib - найкращий ІМО.
Гриффін

8

Якщо ви після свого роду контактного аркуша , і якщо ви працюєте з Unix-подібної операційної системою, ви можете використовувати цей складний сценарій, названий на точці відео Контакту Лист * NIX , короткі VCS .

У фоновому режимі він також використовує ffmpeg(за замовчуванням) або mplayer, отже, може обробляти безліч відеоформатів. Він автоматизує процес зйомки нерухомих зображень із фільму та складання їх до зображення із деяким заголовком та колонтитулом. Ви можете вибрати, наприклад, скільки захоплень ви хочете, або альтернативно між ними часові різниці.

З інтервалом у 10 хвилин виклик виглядає так:

vcs -i 10m input.avi

Перевірте повний список параметрів командного рядка для деяких інших налаштувань.

Ось приклад контактного листа, взятого з домашньої сторінки :

введіть тут опис зображення


7

З VLC 1.1.0 і вище ви можете використовувати фільтр сцени відео:

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

Вищезазначене зберігає 1 з кожні 24 кадри (- співвідношення сцен = 24), починаючи з 00:00:10 і закінчуючи о 00:00:11.

Щойно перевірена та підтверджена робота з VLC 2.0.3 на свіжій установці Windows 8 (у мене немає додаткових відеоплагінів чи програмного забезпечення).

Повна документація: http://wiki.videolan.org/How_to_create_thumbnails


2

VirtualDub може зробити це за вас

File-> Export->Image sequence

введіть тут опис зображення


Чи збереже це кожен кадр як зображення?
Ліам

так, кожен кадр.
Шевек

Мені потрібно пропустити більшість кадрів, для виведення всіх кадрів буде витрачено занадто багато місця для зберігання. Мені потрібен лише один кадр кожні кілька секунд.
Ліам

1

Ви також можете спробувати це

з командного рядка VLC ...

vlc "C: \ YOUR \ file \ path \ file.avi" -V зображення --image-out-prefix = capname --image-out-ratio = 60

file.avi - це відео, з якого ви хочете зробити знімок, capname - це префікс збережених зображень, ви можете пограти зі співвідношенням (60 означає, що 1 з 60 зображень зроблено) Ви можете додати більше команд, наприклад --image-out-формат jpeg збереже ваші шапки як jpegs замість png, --snapshot-path дозволяє вам вибрати, де зберегти шапки.

Джерело вище


Я отримав це повідомлення: Не вдалося завантажити параметри командного рядка, перевірте, чи вони дійсні.
Ліам

У Ubuntu мені надійшло це повідомлення: невідомий варіант або відсутній обов'язковий аргумент `--image-out-prefix = capname '
Ліам

1

Ви можете пропустити кадри в VirtualDub. Просто скористайтеся опцією "Відмінити по", розташованій у меню Відео -> Частота кадрів. Наприклад, якщо ви встановите "Децимація на 100", тоді використовуйте Файл -> Експорт -> Послідовність зображень, це збереже лише кожен 100-й кадр.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.