【问题标题】:WinError 6 in moviepy executionMoviepy 执行中的 WinError 6
【发布时间】: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


【解决方案1】:

所以似乎存在与它相关的持续错误(关于处理内存的事情?我在我经历的几十个网站中的一些网站上阅读过。),我很高兴发现我的假设是错误的,但似乎是这样。 作为临时解决方法,以下方法对我有所帮助。

我将上面的脚本分成两个 python 脚本。这并不理想,但如果它有效,它不是愚蠢的,对吧!?至少它有效。

第一个 python 脚本调用带有第二个 python 脚本的参数。

以下是第一个脚本。

from random import randint
import os
import sys
files = os.listdir('.')
for sourceVideo in files:
    if (sourceVideo[-4:] == ".mp4") or (sourceVideo[-4:] == ".wmv"):
        filedir= sys.argv[0]
        filedir=filedir.replace(os.path.basename(sys.argv[0]),'')
        os.system('extra.py "'+sourceVideo+'"') #or os.system('python extra.py "'+sourceVideo+'"') or os.system('python3 extra.py "'+sourceVideo+'"')

第二个脚本放置在第一个脚本旁边并命名为“extra.py”,它接受文件名(此处为要转换为 gif 的 mp4 或 wmv 文件的名称)作为 sys 参数。我知道这不漂亮,但经过几十个地方找到答案但没有运气,所以这是第二个脚本。

from moviepy.editor import *
from random import randint
import os
import sys
framerate=10

for x in sys.argv:
     if (x[-4:] == ".mp4") or (x[-4:] == ".wmv"):
        filename=x
print(filename)
clip = VideoFileClip(filename)
if  clip.duration < 600:
    for x in range(1,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:
            adition=VideoFileClip(filename).subclip(fi+(60*x),fi+3+(60*x))
            suclip = concatenate_videoclips([suclip,adition]).resize(height=182, width=325)
if  clip.duration > 600:
    for x in range(1,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:
            adition=VideoFileClip(filename).subclip(fi+(120*x),fi+2+(120*x))
            suclip = concatenate_videoclips([suclip,adition]).resize(height=182, width=325)
suclip.write_gif(filename+".gif",fps=framerate)

所以你可以从我的问题中看到,第一个文件转换(mp4 到 gif)总是没有错误,我通过制作另一个脚本来利用它,以便它运行第二个脚本,并为第二个文件,它总是第一个文件转换。 可能这句话没有任何意义,哈哈,但希望你明白我为什么要这样做。所以在将来解决这个错误之前,这就是我的解决方案。

在使用 PyInstaller 将这些文件编译为 exe 的过程中也存在错误,这与 moviepy 使用的 imageio 模块有关。所以,暂时不能转换成exe。

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多