使用 FFmpeg 截取视频中多个图片,然后拼成一张图

发布于 2023-02-02  3070 次阅读


最近在使用一个H5播放器,其中有一个功能是在进度条上设置预览图,但需要合成一个图片

在进度条上设置 预览图

属性类型描述
urlString预览图地址
numberNumber预览图数量
columnNumber预览图列数
widthNumber预览图宽度
heightNumber预览图高度

注意:服务器需要安装 ffmpeg, 请参考官方文档

参考: https://learnku.com/laravel/t/33066 这位大佬给出的教程

我的方案是不管任何长度的视频都合成固定张数图片

首先需要获取视频长度(秒数)

ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i "input.mp4"

命令行会输出视频秒数

直接对视频进行截图并合成一张大图

ffmpeg -i "input.mp4" -vf "fps=1/2,scale=160:90,tile=10x10" -an "output.png"

// fps = 1/2 每2秒截一张图,如果是每秒截一张 参数就是 fps=1
// scale 截图大小,可以设置成固定值如:160:90
// tile 网格化,10x10代表横向10张竖向10张图片

此时我们需要将整个大图都刚好铺满

假设视频时长是a,需要每 a/100 秒截一次才可以铺满,所以fps=100/a

我们将上面的命令整合在一起运行

lengh=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i "input.mp4")
ffmpeg -i "input.mp4" -vf "fps=100/${lengh},scale=160:90,tile=10x10" -an "output.png"

这样我们就输出了一张刚好占满整张大图的网格

打包一个shell程序方便执行

#!/bin/bash

lengh=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 -i $1)
ffmpeg -y -i $1 -vf "fps=100/${lengh},scale=-1:480,tile=10x10" -an $2

// -y 覆盖输出

//使用方法,另存为 .sh文件如demo.sh

./demo.sh "输入.mp4" "输出.jpg"
届ける言葉を今は育ててる
最后更新于 2023-06-22