使用 ffmpeg 将 mp4 转换为 gif 时降低 fps
lower fps when using ffmpeg to convert mp4 to gif
我正在使用 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,
我没有使用 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 解复用器的帧率 选项!)
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质量控制选项。
setting the fps value explicitly gave the same lower fps output
results frame= 346 fps= 24 q=-0.0 Lsize= 6506kB time=00:00:06.92
bitrate=7701.8kbits/s
这不是输出fps!就是编码speed。大多数玩家无法正确播放 fps 高于 50
的 GIF。请参阅显示此行为的 demo。
我正在使用 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,
我没有使用 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 解复用器的帧率 选项!)
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质量控制选项。
setting the fps value explicitly gave the same lower fps output results frame= 346 fps= 24 q=-0.0 Lsize= 6506kB time=00:00:06.92 bitrate=7701.8kbits/s
这不是输出fps!就是编码speed。大多数玩家无法正确播放 fps 高于 50
的 GIF。请参阅显示此行为的 demo。