0

When I try to use cv2.VideoWriter with multiproccesing, I get an error (shown below). How do I fix this?

from .audio import Audio
from .video import Video
from uuid import uuid1
from os import mkdir,listdir
from multiprocessing import Process
import ffmpeg
class Recorder(Video,Audio):
    def __init__(self):
        unique_id = uuid1()
        self.unique_id = unique_id
        directory = listdir(".")
        if "tmp" not in directory:
            mkdir("tmp")
        Video.__init__(self,self.unique_id)
        Audio.__init__(self,self.unique_id)
    
    def record_screen(self):
        video = Process(target = self._record_video)
        video.start()
        audio = Process(target = self._record_audio)
        audio.start()

    def _combine_audio_and_video(self,path):
        video = ffmpeg.input(f'./tmp/{self.unique_id}/video.avi')
        audio = ffmpeg.input(f'./tmp/{self.unique_id}/output.wav')
        out = ffmpeg.output(video, audio, path, vcodec='copy', acodec='aac', strict='experimental')
        out.run()

    def stop(self):
        stop_video = Process(target = self.stop_video)
        stop_video.start()
        stop_audio = Process(target = self.stop_audio)
        stop_audio.start()
        
    def save(self,path):
        print("Saving....")
        self._combine_audio_and_video(path)
        print("FILE SAVED")

The error is

Traceback (most recent call last):
  File "e:\SCREEN RECORDER WITH PY\ok.py", line 5, in <module>
    ok.record_screen()
  File "e:\SCREEN RECORDER WITH PY\screen_recorder\recorder.py", line 19, in record_screen
    video.start()
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\multiprocessing\process.py", line 121, in start
    self._popen = self._Popen(self)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\multiprocessing\context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\multiprocessing\context.py", line 327, in _Popen
    return Popen(process_obj)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\multiprocessing\popen_spawn_win32.py", line 93, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\krish\AppData\Local\Programs\Python\Python38\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle 'cv2.VideoWriter' object
Mark Rotteveel
  • 100,966
  • 191
  • 140
  • 197
robin
  • 1

1 Answers1

0

Processes can only return and receive picklable values. Consider using threading instead, also refer to this question. There are some differences between threads and processes as explained here

Kenivia
  • 384
  • 1
  • 13