代码之家  ›  专栏  ›  技术社区  ›  ThePeskyWabbit

100%的GIF不转换为MP4和Moviepy

  •  2
  • ThePeskyWabbit  · 技术社区  · 7 年前

    当我执行以下代码时:

    import requests
    import moviepy.editor as mp
    
    url = "https://i.imgur.com/VaTidQA.gif"
    with open('temp.gif', 'wb') as f:
        f.write(requests.get(url).content)
    clip = mp.VideoFileClip("temp.gif")
    print(clip.duration)
    clip.write_videofile("temp.mp4")
    

    我在MP4文件中遇到丢失帧的情况。MP4总是从一开始就开始,但在某一点上似乎会任意切断。

    下面是一个例子:

    GIF: https://i.imgur.com/VaTidQA.gif

    MP4: https://giphy.com/gifs/pesky-wabbit-5UqQOjkYLuWrvHzvsA

    GIF确实是完整下载的。

    经过测试,我发现如果我将最后一行更改为:

    clip.set_duration(clip.duration + X).write_videofile("temp.mp4")
    

    然后,它确实会扩展MP4并减少截止,但这需要是一个变量脚本,因为它将用于许多,许多gif。几乎可以肯定的是,电影的持续时间是错误的。我有什么可以补救的建议吗?

    更新:我已经确定moviepy从gif获取的持续时间不正确。当该持续时间传递到 write_videofile() 调用,它只写较短的间隔。我正在研究它是如何确定GIF持续时间的。

    1 回复  |  直到 7 年前
        1
  •  0
  •   ThePeskyWabbit    7 年前

    我将.gif转换改为

    os.system('echo "y"| ffmpeg -i temp.gif -movflags faststart -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" temp.mp4')

    然后使用

           if (dur > 15):
                print("changing duration")
                clip.set_duration(15).write_videofile("buffertemp.mp4")
                clip = mp.VideoFileClip("buffertemp.mp4")
                clip.write_videofile("temp.mp4")