如何使用FFMPEG以一定的间隔创建动画GIF?
各位飞越者你好 简要概述我正在努力实现的目标;我有一个网站,将接受视频上传,上传被转换成mp4格式的制服,并在网上播放使用的许多球员之一。那部分很好,很漂亮 现在的问题是,我想在用户单击播放视频之前,向用户显示视频的一个小比例预览(动画gif)。我现在使用的代码是如何使用FFMPEG以一定的间隔创建动画GIF?,ffmpeg,gif,animated-gif,Ffmpeg,Gif,Animated Gif,各位飞越者你好 简要概述我正在努力实现的目标;我有一个网站,将接受视频上传,上传被转换成mp4格式的制服,并在网上播放使用的许多球员之一。那部分很好,很漂亮 现在的问题是,我想在用户单击播放视频之前,向用户显示视频的一个小比例预览(动画gif)。我现在使用的代码是 ffmpeg-i test.mp4-vf scale=150:-1-t10-r1 test.gif 它用于以每秒1帧的速率创建固定宽度为150px的缩放动画gif,但它只是视频前10秒的动画。我试图做一些事情,扩大帧间距,覆盖整个视频
ffmpeg-i test.mp4-vf scale=150:-1-t10-r1 test.gif
它用于以每秒1帧的速率创建固定宽度为150px的缩放动画gif,但它只是视频前10秒的动画。我试图做一些事情,扩大帧间距,覆盖整个视频长度,但创建一个动画礼物,不超过10秒长
例如,假设我有一个30秒的视频,我希望gif的长度为10秒,但覆盖整个30秒的帧,因此它可能从中的帧3或3秒开始,在gif中创建一个帧,然后在视频中的6秒创建另一个帧,然后在另一个帧中创建9秒,依此类推,最终结果是
example video 30 seconds long example video 1 minute 45 second long
video position - gif frame/per second video position - gif frame/per second
00:03:00 1 00:10:50 1
00:06:00 2 00:21:00 2
00:09:00 3 00:31:50 3
00:12:00 4 00:42:00 4
00:15:00 5 00:52:50 5
00:18:00 6 01:03:00 6
00:21:00 7 01:13:50 7
00:24:00 8 01:24:00 8
00:27:00 9 01:34:50 9
00:30:00 10 01:45:00 10
3 second interval between frames 10.5 second interval between frames
最后你会看到一个10秒长的动画gif,显示整个视频的预览,不管它的长度如何。这基本上可以归结为
视频长度/10(所需动画gif的长度)=帧间使用的间隔
但我不知道如何使用这些数据来解决我的问题
那么,对于如何相对轻松地实现这一点,有人有什么想法或建议吗?我可能可以通过代码计算长度,然后运行命令从视频中提取所需的每一帧,然后从图像中生成gif,但我希望只需一个命令就可以完成这一切。谢谢。因此,我通过代码找到了这个脚本()来完成这项工作,这使得您可以简单地通过帧上的百分比指定要提取的视频中的位置,以及帧之间的间隔,我可以使用以下方法完成上面的问题
// where ffmpeg is located, such as /usr/sbin/ffmpeg
$ffmpeg = '/usr/bin/ffmpeg';
// the input video file
$video = 'sample.avi';
// extract one frame at 10% of the length, one at 20% and so on
$frames = array('10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%');
// set the delay between frames in the output GIF in ms (60 = 1 min)
$joiner = new Thumbnail_Joiner(60);
// loop through the extracted frames and add them to the joiner object specifying
// the max width/height to make the thumb based on the dimensions of the video
foreach (new Thumbnail_Extractor($video, $frames, '150x150', $ffmpeg) as $key => $frame) {
$joiner->add($frame);
}
$joiner->save('sample.gif');
以上内容将占视频长度的10%,抓取动画GIF的第一幅图像的帧,创建60毫秒/1秒的延迟,将视频长度增加20%,并按指定的百分比重复此过程,这将导致任何长度的视频都有一个10秒长的动画GIF,其中包含10帧,在视频中以10%的间隔显示,每次显示1秒