【问题标题】:lower fps when using ffmpeg to convert mp4 to gif使用 ffmpeg 将 mp4 转换为 gif 时降低 fps
【发布时间】:2016-09-30 05:19:38
【问题描述】:

我正在使用 ffmpeg 将高质量视频转换为 gif,大多数视频都是 60fps 及以上720p,但是当我使用下面的代码将视频转换为 gif 时,我得到的 gif fps 非常低输出,

#!/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

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 仍然低于 15fps 左右,

【问题讨论】:

  • 您可能指的是scale=-1:480,而不是scale=480:-1。 720p 和 480p 是指 Y 垂直分辨率。此外,您的计算机可能太慢而无法解码和查看高帧率 GIF(或者至少您的浏览器速度很慢)。尝试 VLC 媒体播放器或 XnView 来查看它们。动画 GIF 不像真正的电影文件那样优化,开发人员不太可能在简单的动画图形之外优化解码。

标签: ffmpeg animated-gif frame-rate


【解决方案1】:

显式设置 fps 值会产生相同的较低 fps 输出 结果帧= 346 fps= 24 q=-0.0 Lsize= 6506kB 时间=00:00:06.92 比特率=7701.8kbits/s

这不是输出fps!这是编码速度。大多数播放器无法正确播放 fps 高于 50 的 GIF。请参阅显示此行为的 demo。

【讨论】:

  • 这很有意义,当使用 gfycat 将 gif 转换为 mp4 时,坚持 50 fps 似乎可以提供最佳视频,
  • @8bittree 已更改为存档链接。
【解决方案2】:

我没有使用 FFmpeg 制作 GIF 文件的经验,但据我所知,fps 过滤器对于实际帧速率值有一个单独的“fps”参数,所以我认为如果你使用它可能无法正常工作省略。

为了确保过滤器获得正确的值,您应该明确设置 fps 值:

filter="fps=fps=50,scale=480:-1:flags=lanczos"

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

ffmpeg -y -i test.mov -i $palette -lavfi "$filter [x]; [x][1:v] paletteuse" -r 50 test.gif

否则,你的控制台输出看起来不错(表示输出将是50fps),所以这个现象有点神秘。


工作解决方案:

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

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

ffmpeg -i <input_file> -filter_complex "scale=w=480:h=-1:flags=lanczos, palettegen=stats_mode=diff" palette.png

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

ffmpeg -i <input_file> -r 50 -f image2 image_%06d.png

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

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 demuxer 的 -framerate 选项! (答案已相应编辑)

替代方法:

  • gifsickle - 图片转gif,可设置帧延迟
  • ImageMagic - 可以直接将视频转换为 gif,优秀的 gif 质量控制选项。

【讨论】:

  • 如果您按照源代码中指定的顺序提供值,则 FFmpeg 过滤器不需要键名。
  • 显式设置 fps 值会得到相同的较低 fps 输出结果frame= 346 fps= 24 q=-0.0 Lsize= 6506kB time=00:00:06.92 bitrate=7701.8kbits/s
  • 使用常规“速率”选项 -r 50 给出了类似的低 fps 输出结果 frame= 346 fps= 20 q=-0.0 Lsize= 6506kB time=00:00:06.92 bitrate=7701.8kbits/s ffmpeg 完全忽略了设置的 fps 并且似乎根据某些东西计算输出 fps,我在docs,有关此行为的任何信息。
  • @GergelyLukacsy 你还使用什么其他工具?
  • @MuhiaNJoroge 进行转换,我只使用 FFmpeg。您是否尝试将视频分解为图像,然后将它们组合成 gif?我相应地更新了我的答案。此外,一些专业的视频编辑工具可以导出为 gif(我认为 Adob​​e Premiere Pro 有)。
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多