我正在开发一个用户可以上传视频的项目。有什么方法可以使用 FFmpeg 从视频中获取一些图像并从中创建 GIF 吗?
由于该项目是用 Java 编写的,我有办法从视频中获取图像,但创建 GIF 需要多个图像,而且成本高昂。
服务器运行的是 Debian X64 系统,因此如果 FFMpeg 不适合,我愿意使用 Linux 上的其他工具来有效地完成此任务。
答案1
我使用 Linux 从视频中提取场景vlc
。如果没有,请使用
apt-get install vlc
安装它。安装后,您可以使用以下命令行的变体从视频中提取帧。默认图像格式是png
,它很适合我的目的。如果您坚持使用gif
图像,我建议安装imagemagick
图像格式转换。这是提取帧的命令:
cvlc ${videofile} \
--video-filter=scene \
--vout=dummy \
--start-time=${start-sec} --stop-time=${end-sec} \
--scene-ratio=1 --scene-prefix=${prefix} \
--scene-path=${MyStorePath} \
vlc://quit
在哪里
videofile
是mp4格式的视频。其他格式可能是可能的,但没有测试
start-sec
是您希望帧抓取开始的位置,以秒为单位
end-sec
是您希望帧抓取结束的位置,从开始的几秒钟内开始。必须大于start-sec
prefix
是捕获图像的文件名的前缀。
MyStorePath
是您要存储捕获的图像的路径。
这个命令可以帮助你计算出视频长度:
ffmpeg -i ${vidfile} 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
输出是HH:MM:SS.xx
格式化的。要将其转换为以秒为单位的视频长度,我使用
l=$(ffmpeg -i ${vidfile} 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//)
h=$(echo $l|cut -d: -f1)
m=$(echo $l|cut -d: -f2)
s=$(echo $l|cut -d: -f3|cut -d"." -f1)
(( hh=$h*3600 ))
(( mm=$m*60 ))
(( LengthSeconds=$hh+$mm+$s ))
此时,您可以操纵LengthSeconds
变量来自动确定开始和结束时间。不幸的是,为了让我的vlc
命令发挥作用,你必须指定从中提取帧的时间片。