当前位置: 首页 > 知识库问答 >
问题:

如何使用具有间隔的FFMPEG创建动画GIF?

康鹏云
2023-03-14

你好,飞越花的伙伴们,

简要概述我正在努力实现的目标;我有一个网站,它将接受视频上传,上传会被转换成mp4格式,以便统一穿着,并使用众多可用播放器之一在网络上播放。那部分很好,很漂亮。

现在的问题是,我想在用户点击播放视频之前,向他们显示视频的简短预览(动画gif)。我现在使用的代码是

ffmpeg-itest.mp4-vf比例=150:-1-t 10-r 1test.gif

它适用于以每秒1帧的速度创建一个固定宽度为150像素的缩放动画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,但我希望只需一个命令就可以完成这一切。谢谢

共有1个答案

万俟渝
2023-03-14

因此,我最终只是通过代码执行此操作,找到了这个脚本(http://www.alberton.info/video_preview_as_animated_gif_with_ffmpeg_and_spl.html#.UxnU_IXYNyI),这使得您可以轻松地通过帧上的百分比指定视频中的位置以提取以及帧之间的间隔,我可以使用以下方法完成上面的问题。

// 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的第一个图像的帧,创建60ms / 1秒的延迟,进入视频长度的20%,并对指定的每个百分比重复该过程,这导致任何长度的视频具有10秒长的动画GIF,其中包含视频中的10帧,长度为10%,长度为10%。显示1秒每。

 类似资料:
  • out.mov的ffprompt-show_stream-show_format的输出如下: 我有一个“示例”片段,它显示了我想要的行为,带有以下流和信息: 我根本无法看出其中的差别。 输入、输出和工作模板可以在这里找到。 (点击链接时,您可能会看到的安全问题来自服务器证书是自签名的。您可以接受临时异常。顺便说一句:输出文件荒谬的文件大小将是下一个需要解决的问题。可能是与压缩有关的问题。)

  • 我正在努力执行这个命令: ffmpeg-loop 1-r5-img_0。jpg-c:v libx264-预设慢调静态图像-crf 24-t 20$frame_目标 我需要把更多的图像,所以我这样做: ffmpeg-loop 1-r5-i img_u%d.jpg-c:v libx264-预设慢调静态图像-crf 24-t 20$frame_u目标 但是这个东西创建20秒的视频,但是图像正在多次变化。

  • 问题内容: 是否有人设法说服ImageIO编写动画GIF,尤其是设置正确的元数据?我的第一次尝试大致如下(其中b1和b2是BufferedImages): 这似乎几乎可以工作,但是: 我显然需要以某种方式设置“适当的”元数据来设置图像之间的时间,并理想地使它们循环(我天真地希望默认设置会做一些明智的事情,但嘿…) 它默认情况下写入的任何元数据显然都不是正确的:GIMP在加载文件时会给出一些错误消息

  • 问题内容: 我需要旋转div并停止在特定位置(该值将从服务器接收)。 我尝试使用本机JS进行旋转和停止,但它占用了我的CPU大量时间。 我可以旋转CSS动画,但是我需要创建一个类,该类将动态描述停止动画的位置。就像是 提前致谢 问题答案: 好吧,我认为动态创建 它们 并不容易, 因为它们必须是硬编码的,所以它们不灵活。 过渡稍微容易一些,因为它们可以优雅地响应JavaScript进行的CSS更改。

  • 关于 Flash 图形 Flash (SWF) 文件格式是一种基于矢量的图形文件格式,它用于适合 Web 的可缩放小尺寸图形。由于这种文件格式基于矢量,因此,图稿可以在任何分辨率下保持其图像品质,并且非常适于创建动画帧。在 Illustrator 中,可以在图层上创建单独的动画帧,然后将图像图层导出到网站上使用的单独帧中。也可以在 Illustrator 文件中定义符号以减小动画的大小。在导出后,

  • 得到的包含我指定的6秒,后跟8或9秒的空音频。我的指挥有问题吗? 编辑: 表示并给我一个文件,从10秒开始有8秒的音频,然后有9或10秒的静默。 我的目标是通过REST API将这个6秒的文件流到前端。我希望用户能够正确下载此文件。理想情况下,它不会有不一致的元数据(14秒而不是6秒)。