katna icon indicating copy to clipboard operation
katna copied to clipboard

Timestamp support for extracted frames

Open TheCodeYoda opened this issue 3 years ago • 2 comments

Is it possible to compute timestamp for extracted frames as frame metadata?

TheCodeYoda avatar Nov 05 '22 14:11 TheCodeYoda

up

OB42 avatar Nov 09 '23 11:11 OB42

I have came up with a solution for this issue. What I did was to create a simple Writer class which will store timestamps in a writer object in place of saving the frames.

Remember this snippet from Katna Docs View Docs

# initialize diskwriter to save data at desired location
diskwriter = KeyFrameDiskWriter(location="selectedframes")

vd.extract_video_keyframes(
     no_of_frames=no_of_frames_to_returned, file_path=video_file_path,
     writer=diskwriter
)

I just replaced writer=diskwriter with my DummyWriter object.

And later when I need to use timestamps, I will call dummywriter.getTimeStamps() which will return timestamp list.

This is my DummyWriter Class which I used

class DummyWriter:
    def __init__(self):
        self.timestamps = []
        pass
    
    def write(self, path, frames):
        self.timestamps = get_timestamps_for_selected_frames(path, frames)
        # Could add code to save the frame
    
    def getTimeStamps(self):
        return self.timestamps

    def get_frame_timestamps(video_path):
        # Open the video file
        cap = cv2.VideoCapture(video_path)
        if not cap.isOpened():
            print("Error: Could not open video.")
            return []

        # Get video properties
        fps = cap.get(cv2.CAP_PROP_FPS)
        total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

        # Calculate timestamps
        timestamps = []
        for i in range(total_frames):
            timestamp = i / fps
            timestamps.append(timestamp)

        cap.release()
        return timestamps

    def get_timestamps_for_selected_frames(video_path, img_final):
        # Get timestamps for all frames in the video
        all_timestamps = get_frame_timestamps(video_path)

        # Open the video file again to read the frames
        cap = cv2.VideoCapture(video_path)
        selected_timestamps = []
        frame_index = 0

        for img in img_final:
            while cap.isOpened():
                ret, frame = cap.read()
                if not ret:
                    break
                if frame_index < len(all_timestamps) and (frame == img).all():
                    selected_timestamps.append(all_timestamps[frame_index])
                    break
                frame_index += 1

        cap.release()
        return selected_timestamps


# Sample usage with Katna
dummywriter = DummyWriter()

vd.extract_video_keyframes(
     no_of_frames=no_of_frames_to_returned, file_path=video_file_path,
     writer=dummywriter
)

print(f'Timestamps : {dummywriter.getTimeStamps()}')

Hope this is helpful 😇

#31 #27

ashiq-firoz avatar Jun 25 '24 17:06 ashiq-firoz