如何使用FFMPEG以一定的间隔创建动画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秒的动画。我试图做一些事情,扩大帧间距,覆盖整个视频

各位飞越者你好

简要概述我正在努力实现的目标;我有一个网站,将接受视频上传,上传被转换成mp4格式的制服,并在网上播放使用的许多球员之一。那部分很好,很漂亮

现在的问题是,我想在用户单击播放视频之前,向用户显示视频的一个小比例预览(动画gif)。我现在使用的代码是

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秒