Как создать предварительный просмотр видео с помощью нескольких кадров с помощью ffmpeg?

1687
Azevedo

Как создать видео для предварительного просмотра с несколькими кадрами, используя только ffmpeg? Например, когда вы наводите курсор мыши на видео, и оно воспроизводит несколько кадров для предварительного просмотра перед загрузкой реального видео?

2

1 ответ на вопрос

2
Azevedo

Пакетный скрипт ниже делает это. Оптимизированный для Интернета, он производит предварительный просмотр видео с 10 изображениями, взятыми из исходного видео. Каждое изображение появляется в течение 1 с. Сценарий получает образцы изображений соответственно, поэтому изображения для предварительного просмотра взяты из всего видео.

  • Требуется только ffmpeg. (и ffprobe, который является частью пакета ffmpeg)

  • Выход: mp4 / h.264 ~ 120Kb (независимо от исходного размера видео) .

  • Полностью настраиваемый.

  • Оптимизирован lanczos и точить фильтр.

  • Сохраняет пропорции исходного видео, помещая его в рамку 16: 9 (384x216) (при необходимости заполните черные полосы по бокам).

  • Временные файлы не используются. (труба на лету от ffmpeg к ffmpeg)

  • HTML5 дружественный.

Вот два примера GIF только для предварительного просмотра. Фактический результат - mp4 / h.264:

16: 9 видео источник. Выход:

16:9 widescreen

Источник видео 4: 3. Выход:

4:3 sd

Запустите на Windows, но это может быть легко преобразовано в скрипт bash (Linux).

Скрипт создает папку, в ./previewкоторой хранятся все созданные превью:

/My videos movie1.mp4 ~ any size movie2.mp4 ~ any size /preview movie1.mp4 ~ 120Kb movie2.mp4 ~ 120Kb  

Его можно настроить для работы с отдельными файлами.

previewGenerator.cmd:

REM ---------------------------------------------- set folder=C:\My videos set vframes=10 set width=384 set height=216 rem w = h*16/9 set filetypes=*.mp4 REM ---------------------------------------------- setlocal EnableDelayedExpansion  pushd "%folder%" if not exist preview md preview for /f "usebackq delims=" %%f in (`dir /b %filetypes%`) do ( if not exist "preview\%%~nf.mp4" (  for /f %%i in ('ffprobe -v error -show_entries format^=duration "%%f" -of default^=noprint_wrappers^=1:nokey^=1') do set length=%%i set /a length=!length!+0 set /a fps=!length!/%vframes% ffmpeg -threads 2 -i "%%f" -an -qscale:v 1 -vf "fps=1/!fps!, scale=iw*min(%width%/iw\,%height%/ih):ih*min(%width%/iw\,%height%/ih):flags=lanczos, pad=%width%:%height%:(%width%-iw*min(%width%/iw\,%height%/ih))/2:(%height%-ih*min(%width%/iw\,%height%/ih))/2, unsharp=5:5:0.5:5:5:0.5" -vframes %vframes% -f image2pipe -vcodec ppm - ^ | ffmpeg -y -threads 2 -framerate 1 -i pipe:0 -c:v libx264 -profile:v baseline -level 3.0 -tune stillimage -r 30 -pix_fmt yuv420p "preview\%%~nf.mp4" ) cls ) 

Обновление: вы можете легко контролировать скорость воспроизведения в HTML5, <video>как показано здесь

Почему бы не использовать GIF вместо этого?

  • .gif формат имеет худшее качество (пиксельные цвета / максимум 256 цветов)

  • Размер файла .gif как минимум в 2 раза больше.

  • Вы не можете контролировать скорость воспроизведения / приостанавливать анимацию после его создания.

Похожие вопросы