0

I wrote a program to convert all videos in a particular folder to 15 second gifs. It takes each video, makes subclips of various lengths and concatenates the subclips to make a 15 second video file

However, I run into some error when processing some videos using 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

How do I fix this?

Shashank
  • 25
  • 8
  • I think this might be to do with the fact that you are using up to much memory. Try with less videos, and see whether it always hits this error on the same batches or whether it always after the same rough amount of files processed. – Tom Burrows May 03 '17 at 13:57
  • I get it on the first video I try to run it on . I tried reducing the number of subclips per video and I got a different error: https://pastebin.com/BjVqL7W8 – Shashank May 03 '17 at 14:23
  • I changed the folder and it worked for around 6 files before getting an OSError. Probably it has something to do with the file type? Maybe it doesn't work with .avi files? I had removed the file extensions of all files so I'm not sure of its file types – Shashank May 03 '17 at 14:32
  • Were those 6 files a lot smaller? If so, then you are almost certainly running out of memory. Go through your code, and make sure you delete all `clip` objects when you have finished with them. – Tom Burrows May 04 '17 at 10:53
  • I tried deleting the list containing all the clips after concatenating them but I still run into the error – Shashank May 04 '17 at 18:17
  • Tried making it as efficient as possible and now it works on more files than it previously did , but I still get errors when it runs on some small files [Here's the code](https://pastebin.com/SYj4FLvA) – Shashank May 04 '17 at 19:02

1 Answers1

1

This only happens to me when I try to iterate through the function VideoFileClip. I could solve this on windows using multiprocessing in parallel.

For example:

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))

Obviously when you finish to iterate if you try to execute your function with the VideoFileClip again you will get the Handle is invalid Error, and you will have to reset your jupyter notebook, but at least you can use your function without receiving any os or python errors, the number of times you need, using pool.starmap

jenridunn
  • 26
  • 1
  • On Windows, the Python processes import the module so you have to put your main code in a `if __name__ == "__main__":` block otherwise the worker processes will also run it and this would result in a fork bomb. – Dan D. Jan 19 '19 at 01:16