Skip to content

Video

logger = get_logger('video_acquire') module-attribute

PER_LENGTH = 1800 # 30 minutes

the screen width and height

WIDTH = 640 HEIGHT = 480 FPS = 24.0

VideoAcquire

Source code in Client/Listener/videos_acquire.py
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
class VideoAcquire:
    def __init__(
        self,
        width=WIDTH,
        height=HEIGHT,
        fps=FPS,
        per_video_length=PER_LENGTH,
        api_domain="",
        token="",
        home_id: int = None,
    ):
        """
        init the video acquire
        Args:
            width: (int) the width of the video
            height (int): the height of the video
            fps (float): the frame per second
            per_video_length (int): the length of the video
            api_domain (str): the domain of the api
            token (str): the token of the api
            home_id (int): the home id
        """
        self.uid = str(uuid.uuid4())
        self.data_dir = DATA_DIR / "videos" / self.uid  # the data dir
        self.data_dir.mkdir(parents=True, exist_ok=True)
        self.width = width  # the width and height of the video
        self.height = height  # the width and height of the video
        self.fps = fps  # frame per second
        self.per_video_length = per_video_length  # the length of the video
        self.api = API(domain=api_domain, token=token, home_id=home_id)
        self.api.register_device()

    def record(self):
        """
        start to record the video
        """
        segment_images = 60
        seconds = 0
        minutes = 1

        # init the recording
        cap = cv2.VideoCapture(0)
        # set the width and height
        cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.width)
        cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.height)
        # set the frame per second
        cap.set(cv2.CAP_PROP_FPS, 24.0)
        # use the XVID codec
        fourcc = cv2.VideoWriter_fourcc(*"avc1")  # noqa

        cap_fps = cap.get(5)  # get the fps of the camera
        logger.info(f"the fps of the camera is {cap_fps}")

        start_time = datetime.now()
        filename = self.data_dir / (start_time.strftime("%Y-%m-%d_%H-%M-%S") + ".mp4")

        out = cv2.VideoWriter(
            filename.as_posix(), fourcc, self.fps, (self.width, self.height)
        )  # noqa
        logger.info("start to record the video")
        flag = True
        while flag:
            try:
                if (datetime.now() - start_time).seconds >= self.per_video_length:
                    # stop the recording and save the video when the time is up
                    logger.info(f"the recording is finished, saved to file: {filename}")
                    out.release()
                    # TODO: post the video to the server
                    self.api.post_video(
                        self.uid,
                        filename.as_posix().split("/")[-1],
                        start_time=start_time,
                        end_time=datetime.now(),
                    )
                    # resume the recording
                    start_time = datetime.now()
                    filename = self.data_dir / (
                        start_time.strftime("%Y-%m-%d_%H-%M-%S") + ".mp4"
                    )
                    out = cv2.VideoWriter(
                        filename.as_posix(), fourcc, FPS, (self.width, self.height)
                    )  # noqa
                else:
                    # read the frame
                    logger.debug("Try to process the frame")
                    ret, frame = cap.read()
                    if ret:
                        logger.debug("write the frame")
                        out.write(frame)
                        # cv2.imshow("frame", frame)
                        if seconds == segment_images:
                            logger.info("begin the next frame segment")
                            seconds = 0
                            minutes += 1
                        if seconds < segment_images:
                            image_dir = (
                                self.data_dir
                                / "frames"
                                / f"{datetime.now().strftime('%Y-%m-%d_%H-%M')}"
                            )
                            image_dir.mkdir(parents=True, exist_ok=True)
                            cv2.imwrite(
                                (image_dir / f"{seconds}.jpg").as_posix(), frame
                            )
                            seconds += 1
                if cv2.waitKey(1) == ord("q"):
                    break
            except KeyboardInterrupt:
                break
        cap.release()

__init__(width=WIDTH, height=HEIGHT, fps=FPS, per_video_length=PER_LENGTH, api_domain='', token='', home_id=None)

init the video acquire Args: width: (int) the width of the video height (int): the height of the video fps (float): the frame per second per_video_length (int): the length of the video api_domain (str): the domain of the api token (str): the token of the api home_id (int): the home id

Source code in Client/Listener/videos_acquire.py
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
def __init__(
    self,
    width=WIDTH,
    height=HEIGHT,
    fps=FPS,
    per_video_length=PER_LENGTH,
    api_domain="",
    token="",
    home_id: int = None,
):
    """
    init the video acquire
    Args:
        width: (int) the width of the video
        height (int): the height of the video
        fps (float): the frame per second
        per_video_length (int): the length of the video
        api_domain (str): the domain of the api
        token (str): the token of the api
        home_id (int): the home id
    """
    self.uid = str(uuid.uuid4())
    self.data_dir = DATA_DIR / "videos" / self.uid  # the data dir
    self.data_dir.mkdir(parents=True, exist_ok=True)
    self.width = width  # the width and height of the video
    self.height = height  # the width and height of the video
    self.fps = fps  # frame per second
    self.per_video_length = per_video_length  # the length of the video
    self.api = API(domain=api_domain, token=token, home_id=home_id)
    self.api.register_device()

record()

start to record the video

Source code in Client/Listener/videos_acquire.py
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def record(self):
    """
    start to record the video
    """
    segment_images = 60
    seconds = 0
    minutes = 1

    # init the recording
    cap = cv2.VideoCapture(0)
    # set the width and height
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.width)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.height)
    # set the frame per second
    cap.set(cv2.CAP_PROP_FPS, 24.0)
    # use the XVID codec
    fourcc = cv2.VideoWriter_fourcc(*"avc1")  # noqa

    cap_fps = cap.get(5)  # get the fps of the camera
    logger.info(f"the fps of the camera is {cap_fps}")

    start_time = datetime.now()
    filename = self.data_dir / (start_time.strftime("%Y-%m-%d_%H-%M-%S") + ".mp4")

    out = cv2.VideoWriter(
        filename.as_posix(), fourcc, self.fps, (self.width, self.height)
    )  # noqa
    logger.info("start to record the video")
    flag = True
    while flag:
        try:
            if (datetime.now() - start_time).seconds >= self.per_video_length:
                # stop the recording and save the video when the time is up
                logger.info(f"the recording is finished, saved to file: {filename}")
                out.release()
                # TODO: post the video to the server
                self.api.post_video(
                    self.uid,
                    filename.as_posix().split("/")[-1],
                    start_time=start_time,
                    end_time=datetime.now(),
                )
                # resume the recording
                start_time = datetime.now()
                filename = self.data_dir / (
                    start_time.strftime("%Y-%m-%d_%H-%M-%S") + ".mp4"
                )
                out = cv2.VideoWriter(
                    filename.as_posix(), fourcc, FPS, (self.width, self.height)
                )  # noqa
            else:
                # read the frame
                logger.debug("Try to process the frame")
                ret, frame = cap.read()
                if ret:
                    logger.debug("write the frame")
                    out.write(frame)
                    # cv2.imshow("frame", frame)
                    if seconds == segment_images:
                        logger.info("begin the next frame segment")
                        seconds = 0
                        minutes += 1
                    if seconds < segment_images:
                        image_dir = (
                            self.data_dir
                            / "frames"
                            / f"{datetime.now().strftime('%Y-%m-%d_%H-%M')}"
                        )
                        image_dir.mkdir(parents=True, exist_ok=True)
                        cv2.imwrite(
                            (image_dir / f"{seconds}.jpg").as_posix(), frame
                        )
                        seconds += 1
            if cv2.waitKey(1) == ord("q"):
                break
        except KeyboardInterrupt:
            break
    cap.release()