Как я могу извлечь изображение из определенного времени видео в Xubuntu 16.04?

8

Я ищу вариант командной строки.

Например, если у меня есть видео sample-video.mp4, и я хочу сгенерировать файл изображения sample-image.jpgиз видео во время 00:00:26, какую команду мне следует дать?

Кроме того, было бы очень полезно, если бы вы могли подробно объяснить, какова функция каждого аргумента команды.

Sonevol
источник
2
Согласно этому вопросу и его ответам, ffmpegкажется, поддерживаются имена файлов для вывода.
IQV

Ответы:

8

Вы можете использовать mplayer(из пакета mplayer, не установленного по умолчанию):

mplayer -vo jpeg -ss 00:00:26 -frames 1 sample-video.mp4

Это создаст файл, 00000001.jpgпоэтому вы должны переименовать его. Насколько я знаю, нет способа указать имя файла.

-vo jpegозначает, что вы хотите вывод JPEG, -ss 00:00:26стремится к заданной позиции, -frames 1означает, что обработать один кадр, а затем выйти.

Флориан Диш
источник
В чем преимущество получения более 1 кадра? Будут ли это копии или каждый кадр будет отличаться на секунду?
Соневоль
Изображения, созданные из нескольких кадров, будут отличаться на доли секунды. Точное значение зависит от видео.
Флориан Диш
5
@Sonevol Кадр точно в 0:00:26 может быть не совсем то , что вы хотите. Вы можете взять ~ 50 кадров между 0:00:25 и 0:00:27 (или даже просто 3-4 кадра вокруг отметки 0:00:26), а затем просмотреть их, чтобы выбрать лучший.
xDaizu
1
@FlorianDiesch Можно также выводить в png что-то вроде: -vo png:z=9с параметром -z, определяющим уровень сжатия. Для JPEG можно также добавить в настройках качества: -vo jpeg:quality=100. Но ваш ответ велик, как это уже :)
Андрей.46
13

Вы можете использовать ffmpeg

ffmpeg -loglevel quiet -ss 26 -i sample-video.mp4  -t 1 -f image2 anyfilename.jpeg
  • -loglevel установил выход выхода в тихий режим, потому что ffmpeg очень болтлив
  • -ss это поиск (в секундах, т.е. где вы хотите сделать снимок)
  • -i входной видеофайл
  • -t таймфрейм снимка (в секундах)
  • -f тип файла

Вы также можете поиграть с параметрами, такими как контроль качества вывода JPEG -q:v <linear integer 1-10>или разрешения -s 480x300.

Еще несколько идей здесь


Метод VLC

cvlc sample-video.mp4 --start-time=26 --run-time=1 --rate=1 --video-filter=scene --vout=dummy --aout=dummy  --scene-ratio=24 --scene-prefix=sample-image --scene-replace vlc://quit
  • cvlc - потому что это командная строка, и мы не хотим, чтобы какие-либо окна открывались. Кроме того, это означает, что мы можем запустить его без X11.

  • --start-time = 26 - точное положение снимка в секундах

  • --run-time = 1 - как долго видео будет «проигрываться» в секундах. Мы играем на одну секунду, чтобы сделать скриншот этой секунды
  • --rate = 1, когда снимать скриншот. Это в основном означает «каждую секунду» и полезно, если у вас есть более длинные файлы, делать снимок экрана каждые 60 секунд или каждые 5 минут
  • --video-filter = сцена говорит VLC, что мы хотим делать скриншоты
  • --vout = dummy для вывода видео на X11 нет, нам это не нужно
  • --aout = пустышка не выводится для аудио, нам это не нужно
  • - отношение сцены = 24 мы говорим VLC, что есть приблизительно 24 кадра в секунду
  • --scene-prefix = sample-image имя файла вашего скриншота
  • - заменить сцену заменить любые файлы, которые называются как ваш скриншот sample-image.pngс вашим текущим скриншотом. Если вы пропустите это, VLC начнет нумерацию скриншотов
  • vlc: // выйти из vlc, как только мы закончим

Полная документация здесь

Роберт Ридл
источник
Что вы подразумеваете под болтливым? И я хочу снимок на 26-й секунде. Так зачем указывать сроки по -t. Я снимаю изображение, а не видео.
Sonevol
3
"Chatty", потому что ffmpeg печатает более 40 строк журнала с помощью этой команды, например, текущая версия, тип настройки и информация о входном видеофайле - что вас не интересует. Для вашей цели вы, вероятно, можете опустить "-t 1". Кажется, по умолчанию это одна секунда или часть того, что хорошо для скриншота. Приятной разницей является возможность определить выходное имя файла и настроить качество / разрешение и т. Д.
Роберт Ридл