import av class Camera: def __init__(self, cam_type_state, stream_type, camera_id): try: camera_id = int(camera_id) except ValueError: # allow strings, ex: /dev/video0 pass self.cam_type_state = cam_type_state self.stream_type = stream_type self.cur_frame_id = 0 self.container = av.open(camera_id) assert self.container.streams.video, f"Can't open video stream for camera {camera_id}" self.video_stream = self.container.streams.video[0] self.W = self.video_stream.codec_context.width self.H = self.video_stream.codec_context.height @classmethod def bgr2nv12(self, bgr): frame = av.VideoFrame.from_ndarray(bgr, format='bgr24') return frame.reformat(format='nv12').to_ndarray() def read_frames(self): for frame in self.container.decode(self.video_stream): img = frame.to_rgb().to_ndarray()[:,:, ::-1] # convert to bgr24 yuv = Camera.bgr2nv12(img) yield yuv.data.tobytes() self.container.close()