Imageio python 错误地将 GIF 转换为 MP4
Imageio python converts GIF to MP4 incorrectly
我正在编写一个函数来加速 up/down 给定的 GIF(或 .gifv)文件,并将生成的动画保存为 .mp4 文件。
我正在使用 python imageio 包(及其 ffmpeg 插件)来执行此操作 - 从 gif 下载原始二进制数据,将每一帧写入 mp4,并设置 mp4 的 fps随便什么。
我的密码是-
def changespeed(vid, mult):
vid = vid.replace('.gifv', '.gif')
data = urllib2.urlopen(vid).read()
reader = imageio.get_reader(data, 'gif')
dur = (float(reader.get_meta_data()['duration']))
oldfps = 1000.0 / (10 if dur == 0 else dur)
writer = imageio.get_writer('output.mp4', fps=(oldfps*mult), quality=8.0)
for frame in reader:
writer.append_data(frame)
writer.close()
问题是,有时输出的颜色会严重损坏,而且似乎没有任何可预测性。某些 gif 会发生这种情况,而其他 gif 则不会。我曾尝试在 writer
中设置高质量参数,但这没有帮助。
这是一个有问题的 GIF 示例 -
输入:https://i.imgur.com/xFezNYK.gif
输出:https://giant.gfycat.com/MelodicShimmeringBarb.mp4
我可以在 output.mp4
本地看到这个问题,所以问题不在于上传到 Gfycat。
我可以做些什么来避免这种行为?谢谢。
更新 - 搞清楚了。颜色本身没有损坏 - 黑色部分实际上是透明部分,应该用前一帧的数据替换。
使用此代码确保透明部分保持透明(并且可以稍后与 PIL 进行 alpha 合成)而不是黑色:
https://gist.github.com/BigglesZX/4016539
我正在编写一个函数来加速 up/down 给定的 GIF(或 .gifv)文件,并将生成的动画保存为 .mp4 文件。
我正在使用 python imageio 包(及其 ffmpeg 插件)来执行此操作 - 从 gif 下载原始二进制数据,将每一帧写入 mp4,并设置 mp4 的 fps随便什么。
我的密码是-
def changespeed(vid, mult):
vid = vid.replace('.gifv', '.gif')
data = urllib2.urlopen(vid).read()
reader = imageio.get_reader(data, 'gif')
dur = (float(reader.get_meta_data()['duration']))
oldfps = 1000.0 / (10 if dur == 0 else dur)
writer = imageio.get_writer('output.mp4', fps=(oldfps*mult), quality=8.0)
for frame in reader:
writer.append_data(frame)
writer.close()
问题是,有时输出的颜色会严重损坏,而且似乎没有任何可预测性。某些 gif 会发生这种情况,而其他 gif 则不会。我曾尝试在 writer
中设置高质量参数,但这没有帮助。
这是一个有问题的 GIF 示例 -
输入:https://i.imgur.com/xFezNYK.gif
输出:https://giant.gfycat.com/MelodicShimmeringBarb.mp4
我可以在 output.mp4
本地看到这个问题,所以问题不在于上传到 Gfycat。
我可以做些什么来避免这种行为?谢谢。
更新 - 搞清楚了。颜色本身没有损坏 - 黑色部分实际上是透明部分,应该用前一帧的数据替换。
使用此代码确保透明部分保持透明(并且可以稍后与 PIL 进行 alpha 合成)而不是黑色: https://gist.github.com/BigglesZX/4016539