2

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

1 ответ1

2

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

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

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

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

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

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

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

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

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

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

16:9 широкоформатный

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

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 раза больше.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .