如何使用ffmpeg生成几帧的网络预览视频?


2

如何仅使用ffmpeg生成几帧的网络预览视频?就像在视频上移动鼠标并在加载实际视频之前播放几帧预览一样?

Answers:


3

下面的批处理脚本就是这样做的。针对网络进行了优化,可生成预览视频,其中包含从原始视频中拍摄的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 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倍。

  • 构建完成后,无法控制播放速度/暂停gif动画。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.