最近在使用一个H5播放器,其中有一个功能是在进度条上设置预览图,但需要合成一个图片
在进度条上设置 预览图
| 属性 | 类型 | 描述 |
|---|---|---|
url | String | 预览图地址 |
number | Number | 预览图数量 |
column | Number | 预览图列数 |
width | Number | 预览图宽度 |
height | Number | 预览图高度 |
注意:服务器需要安装 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"



Comments NOTHING