Как создать видео для предварительного просмотра с несколькими кадрами, используя только ffmpeg? Например, когда вы наводите курсор мыши на видео, и оно воспроизводит несколько кадров для предварительного просмотра перед загрузкой реального видео?
1 ответ
Пакетный скрипт ниже делает это. Оптимизированный для Интернета, он производит предварительный просмотр видео с 10 изображениями, взятыми из исходного видео. Каждое изображение появляется в течение 1 с. Сценарий получает образцы изображений соответственно, поэтому изображения для предварительного просмотра взяты из всего видео.
Требуется только ffmpeg. (и ffprobe, который является частью пакета ffmpeg)
Выход: mp4/h.264 ~ 120Kb (независимо от исходного размера видео).
Полностью настраиваемый.
Оптимизирован lanczos и точить фильтр.
Сохраняет пропорции исходного видео, помещая его в рамку 16: 9 (384x216) (при необходимости заполните черные полосы по бокам).
Временные файлы не используются. (труба на лету от ffmpeg к ffmpeg)
HTML5 дружественный.
Вот два примера GIF только для предварительного просмотра. Фактический результат - mp4/h.264:
16:9 видео источник. Выход:
Источник видео 4:3. Выход:
Запустите на 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 раза больше.
Вы не можете контролировать скорость воспроизведения / приостанавливать анимацию после его создания.