FFMpeg:将视频文件转换为包含视频中多个图像的 gif

FFMpeg:将视频文件转换为包含视频中多个图像的 gif

我正在开发一个用户可以上传视频的项目。有什么方法可以使用 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命令发挥作用,你必须指定从中提取帧的时间片。

相关内容