首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ffmpeg将mp4转换为gif时的较低fps

使用ffmpeg将mp4转换为gif时的较低fps
EN

Stack Overflow用户
提问于 2016-06-01 02:35:33
回答 2查看 23.4K关注 0票数 10

我用ffmpeg把高质量的视频转换成gif,大部分视频都是60 fps和720p,但是当我使用下面的代码将视频转换成gif时,我得到的gif输出的fps非常低,

代码语言:javascript
复制
#!/usr/bin/env
palette=/tmp/pallete.png
filter="fps=50,scale=480:-1:flags=lanczos"

ffmpeg -y  -i test.mov -vf $filter,palettegen=stats_mode=diff $palette
ffmpeg -y -i test.mov -i $palette -lavfi "$filter [x]; [x][1:v] paletteuse" test.gif

我注意到的另一个问题是-随着宽度的增加,例如720而不是480,我得到了更低的fps。

下面是输出日志示例,输出fps低于指定的50fps

代码语言:javascript
复制
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/tmp/201631203815.mp4':
Metadata:
 major_brand     : isom
 minor_version   : 512
 compatible_brands: isomiso2avc1mp41
 encoder         : Lavf56.36.100
Duration: 00:00:05.48, start: 0.016000, bitrate: 1579 kb/s

Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1334x1334, 1576 kb/s, 60.18 fps, 60 tbr, 1000k tbn, 50 tbc (default)
Metadata:
  handler_name    : VideoHandler

Input #1, png_pipe, from '/tmp/pallete.png':
   Duration: N/A, bitrate: N/A
Stream #1:0: Video: png, rgba(pc), 16x16 [SAR 1:1 DAR 1:1], 25 tbr, 25 tbn, 25 tbc

Output #0, gif, to '/tmp/201631203815.gif':
Metadata:
  major_brand     : isom
  minor_version   : 512
  compatible_brands: isomiso2avc1mp41
  encoder         : Lavf56.40.101
Stream #0:0: Video: gif, pal8, 480x480, q=2-31, 200 kb/s, 50 fps, 100 tbn, 50 tbc (default)
Metadata:
  encoder         : Lavc56.60.100 gif
Stream mapping:
   Stream #0:0 (h264) -> fps
   Stream #1:0 (png) -> paletteuse:palette
  paletteuse -> Stream #0:0 (gif)
Press [q] to stop, [?] for help

frame=  275 fps= 32 q=-0.0 Lsize=    2480kB time=00:00:05.50 bitrate=3693.5kbits/s    

如何确保输出fps始终是用户设置的?任何有关这方面的资源都将受到高度赞赏。

更新

我还注意到,使用更高的fps (如filter="fps=90,scale=480:-1:flags=lanczos" )会减缓gif的速度,就像慢动作效应一样,输出fps仍在15 fps左右。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-02 06:06:02

将fps值显式地设置为相同的较低fps输出结果frame= 346 fps= 24 q=-0.0 Lsize= 6506kB time=00:00:06.92比特率=7701.8kbit/s。

这不是输出fps!这是编码速度。大多数玩家没有正确地使用高于50的GIF。请参见显示此行为的演示

票数 10
EN

Stack Overflow用户

发布于 2016-06-01 08:49:44

我没有使用FFmpeg制作GIF文件的经验,但据我所知,fps过滤器对于实际的框架值有一个独立的"fps“参数,所以我认为如果省略这个参数,它可能不能正确工作。

为了确保过滤器得到正确的值,您应该显式地设置fps值:

代码语言:javascript
复制
filter="fps=fps=50,scale=480:-1:flags=lanczos"

如果它不起作用,我也会尝试常规的“费率”选项:

代码语言:javascript
复制
ffmpeg -y -i test.mov -i $palette -lavfi "$filter [x]; [x][1:v] paletteuse" -r 50 test.gif

否则,您的控制台输出看起来很好(它表示输出将为50 bit ),因此这种现象有点神秘。

工作解决方案:

您所需要做的就是将这个过程分成三个单独的步骤,并使用"-framerate“demux-选项。

首先,让我们生成调色板文件:

代码语言:javascript
复制
ffmpeg -i <input_file> -filter_complex "scale=w=480:h=-1:flags=lanczos, palettegen=stats_mode=diff" palette.png

其次,将视频帧分解为图像文件:

代码语言:javascript
复制
ffmpeg -i <input_file> -r 50 -f image2 image_%06d.png

最后,将上述图像连接到一个GIF序列中:(这里的重要部分是image2 demuxer的framerate选项!)

代码语言:javascript
复制
ffmpeg -framerate 50 -i image_%06d.png -i palette.png -filter_complex "[0]scale=w=400:h=-1[x];[x][1:v] paletteuse" -pix_fmt rgb24 output.gif

编辑:终于找到答案了!

您需要使用image2破乳器的-framerate选项!(相应的答案编辑)

替代方法:

  • 小镰刀 -将图像转换为gif,可以设置帧延迟。
  • ImageMagic --可以直接将视频转换成gif,优秀的gif质量控制选项。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37558504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档