将视频快速分割成“x”帧块

问题描述 投票:0回答:1

我正在尝试将视频分割成每个 1000 帧的块(必须在帧级别完成)。我目前正在使用opencv库,但是它很慢。将 1 小时的视频分割成这些大小相等的块需要半个小时。

这是我目前正在使用的功能:

def split_video(video_path, output_dir, frames_per_chunk=1000):
    cap = cv2.VideoCapture(video_path)
    fps = cap.get(cv2.CAP_PROP_FPS)
    frame_count = 0
    chunk_count = 0
    frames = []
    
    # Create output directory if it doesn't exist
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    frame_idx = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        frames.append(frame)
        frame_count += 1
        # Save chunk after every 'frames_per_chunk' frames
        if frame_count % frames_per_chunk == 0:
            chunk_filename = f'video_chunk_{chunk_count}.mp4'
            chunk_path = os.path.join(output_dir, chunk_filename)
            save_frames_to_video(frames, chunk_path, fps)
            frames = []
            chunk_count += 1
        frame_idx +=1

    # Save any remaining frames
    if frames:
        chunk_filename = f'video_chunk_{chunk_count}.mp4'
        chunk_path = os.path.join(output_dir, chunk_filename)
        save_frames_to_video(frames, chunk_path, fps)

    print(f'video split into {chunk_count + 1} chunks')
    cap.release()
    return

Python 中还有其他更有效的方法或库吗?我已经研究过 ffmpeg 库,但这似乎只能很好地处理按持续时间而不是按数字帧分割。

python opencv video ffmpeg compression
1个回答
0
投票

你可以使用 ffmpeg 来做到这一点。

ffmpeg -i input.mp4 -c 复制 -map 0 -f 段 -segment_frames 1000,2000,3000,4000,5000 输出_%03d.mp4

此命令将按帧号 1000、2000、3000、4000、4000、5000 等对视频进行分段。

请记住视频的 FPS 和 GOP。

© www.soinside.com 2019 - 2024. All rights reserved.