簡體   English   中英

使用MoviePy時遇到OSError

[英]Running into OSError when I use MoviePy

我編寫了一個程序,將特定文件夾中的所有視頻轉換為15秒gif。 它拍攝每個視頻,制作各種長度的子片段,並將這些子片段連接起來以制作15秒的視頻文件

但是,使用MoviePy處理某些視頻時,我遇到了一些錯誤。

Traceback (most recent call last):
  File "C:\Users\...\Desktop\Python\Test\15secondsgifs.py", line 75, in <module>
    main()
  File "C:\Users\...\Desktop\Python\Test\15secondsgifs.py", line 69, in main
    short_clip = make_clips(vid,clip_dur,i,parts)
  File "C:\Users\...\Desktop\Python\Test\15secondsgifs.py", line 30, in make_clips
    clip = (vid.subclip(t1, t2))
  File "<decorator-gen-39>", line 2, in subclip
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\decorators.py", line 89, in wrapper
    return f(*new_a, **new_kw)
  File "<decorator-gen-38>", line 2, in subclip
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\decorators.py", line 29, in apply_to_mask
    newclip = f(clip, *a, **k)
  File "<decorator-gen-37>", line 2, in subclip
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\decorators.py", line 41, in apply_to_audio
    newclip = f(clip, *a, **k)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\Clip.py", line 391, in subclip
    newclip = self.fl_time(lambda t: t + t_start, apply_to=[])
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\Clip.py", line 189, in fl_time
    keep_duration=keep_duration)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\Clip.py", line 136, in fl
    newclip = self.set_make_frame(lambda t: fun(self.get_frame, t))
  File "<decorator-gen-57>", line 2, in set_make_frame
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\decorators.py", line 14, in outplace
    f(newclip, *a, **k)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\video\VideoClip.py", line 694, in set_make_frame
    self.size = self.get_frame(0).shape[:2][::-1]
  File "<decorator-gen-14>", line 2, in get_frame
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\decorators.py", line 89, in wrapper
    return f(*new_a, **new_kw)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\Clip.py", line 95, in get_frame
    return self.make_frame(t)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\Clip.py", line 136, in <lambda>
    newclip = self.set_make_frame(lambda t: fun(self.get_frame, t))
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\Clip.py", line 188, in <lambda>
    return self.fl(lambda gf, t: gf(t_func(t)), apply_to,
  File "<decorator-gen-14>", line 2, in get_frame
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\decorators.py", line 89, in wrapper
    return f(*new_a, **new_kw)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\Clip.py", line 95, in get_frame
    return self.make_frame(t)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\video\io\VideoFileClip.py", line 103, in <lambda>
    self.make_frame = lambda t: self.reader.get_frame(t)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 175, in get_frame
    self.initialize(t)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\moviepy\video\io\ffmpeg_reader.py", line 103, in initialize
    self.proc = sp.Popen(cmd, **popen_params)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\subprocess.py", line 842, in __init__
    _cleanup()
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\subprocess.py", line 505, in _cleanup
    res = inst._internal_poll(_deadstate=sys.maxsize)
  File "C:\Users\...\AppData\Local\Programs\Python\Python35-32\lib\subprocess.py", line 1259, in _internal_poll
    if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
OSError: [WinError 6] The handle is invalid

我該如何解決?

這僅在我嘗試遍歷VideoFileClip函數時發生。 我可以使用並行處理在Windows上解決此問題。

例如:

from multiprocessing.dummy import Pool as ThreadPool
# The number 5 is the number of iterations you need in parallel,
# for example if you want to process 5 videos with your function.
pool = ThreadPool(5)

#var1 and var2 or any number of vars should be a list
#pool.starmap will iterate these vars through your function in parallel 


  def myfunction(var1, var2):
         clip = VideoFileClip('path')
         #Do something
         clip.reader.close()
         clip.close()

pool.starmap(myfunction, zip(var1, var2))

顯然,當您完成嘗試通過VideoFileClip再次執行函數的迭代時,會出現“句柄無效”錯誤,並且必須重置jupyter筆記本,但至少可以在不接收任何os或python的情況下使用函數錯誤,使用pool.starmap所需的次數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM