【发布时间】:2019-09-16 03:03:38
【问题描述】:
我知道这已经发布了很多次,但我认为这已经完全解决了。以下是我的代码..
from moviepy.editor import *
from random import randint
import os
import subprocess
files = os.listdir('.')
for sourceVideo in files:
if (sourceVideo[-4:] == ".mp4") or (sourceVideo[-4:] == ".wmv"):
framerate=10
filename=sourceVideo
print(filename)
clip = VideoFileClip(filename)
print( clip.duration )
if clip.duration < 600:
for x in range(1,int(clip.duration/60)):
#print( int(clip.duration/60) )
fi = randint(1,int(clip.duration/60))
if x == 1:
suclip=VideoFileClip(filename).subclip(fi,fi+3).resize(height=182, width=325)
else:
suclip =concatenate_videoclips([suclip,VideoFileClip(filename).subclip(fi+(60*x),fi+3+(60*x))]).resize(height=182, width=325)
if clip.duration > 600:
for x in range(1,int(int(clip.duration/60)/2)):
#print( int(int(clip.duration/60)/2) )
fi = randint(1,118)
if x == 1:
suclip=VideoFileClip(filename).subclip(fi,fi+2).resize(height=182, width=325)
else:
suclip =concatenate_videoclips([suclip,VideoFileClip(filename).subclip(fi+(120*x),fi+2+(120*x))]).resize(height=182, width=325)
suclip.write_gif(filename+".gif",fps=framerate)
以上代码查找所有 mp4 或 wmv 格式文件,然后为每个文件获取 2 或 3 秒时长的子剪辑并将它们合并,然后将其转换为 gif。
代码适用于文件夹中的第一个 mp4 文件。但是当它到达第二个时,它会抛出如下错误。
现在,我看到了以下解决方案的链接。 Getting "OSError: [WinError 6] The handle is invalid" in VideoFileClip function
https://github.com/Zulko/moviepy/issues/73
还有更多类似的。
他们都建议添加以下一种或另一种解决方案,例如添加以下..
clip.reader.close()
clip.audio.reader.close_proc()
clip.__del__()
del suclip
del clip
subprocess._cleanup()
我已经尝试将它们都放在我的代码末尾,在它写入 gif 文件之后。但错误仍然存在。
它可以正常工作并创建文件夹的第一个视频的 gif,完全没有任何问题或错误。 每个 mp4 的文件大小约为 100MB。
我也试过用这个
adition=VideoFileClip(filename).subclip(fi+(120*x),fi+2+(120*x))
suclip = concatenate_videoclips([suclip,adition]).resize(height=182, width=325)
del adition
而不是这个
suclip =concatenate_videoclips([suclip,VideoFileClip(filename).subclip(fi+(120*x),fi+2+(120*x))]).resize(height=182, width=325)
但它没有帮助。
我们将不胜感激任何解决方案。谢谢你。 :)
【问题讨论】:
-
要测试它,只需将一堆任意大小的 mp4 连同它一起放在一个文件夹中并运行它。它在第二个 gif 制作时产生错误。
标签: python-3.x runtime-error moviepy