wangzhibo
2024-12-09 1d077b3a77bb988af8a4d5146d27aebaa10e86da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
import cv2
from scenedetect import detect, ContentDetector
 
# 检测视频中的场景
scene_list = detect('demo3.mp4', ContentDetector())
 
# 存储修改后的场景信息
modified_scene_list = []
 
# 遍历场景
for i, scene in enumerate(scene_list):
    if i == 0:
        # 第一个场景直接添加
        modified_scene_list.append(scene)
    elif i == len(scene_list) - 1:
        # 最后一个场景不处理
        modified_scene_list.append(scene)
    else:
        # 从第二个场景开始,处理前两帧
        current_scene_start_frame = scene[0].get_frames()
        current_scene_end_frame = scene[1].get_frames()
 
        # 获取前一个场景
        previous_scene = modified_scene_list[-1]
 
        # 获取前一个场景的结束帧
        previous_scene_end_frame = previous_scene[1].get_frames()
 
        # 更新前一个场景的结束帧,将当前场景的前两帧拼接到前一个场景后面
        modified_previous_scene_end_frame = previous_scene_end_frame + 2
 
        # 更新前一个场景的结束时间
        modified_scene_list[-1] = (previous_scene[0], scene[0])
 
        # 添加当前场景(去掉前两帧)
        modified_scene_list.append((scene[0], scene[1]))
 
# 打开原始视频
cap = cv2.VideoCapture('demo3.mp4')
fps = cap.get(cv2.CAP_PROP_FPS)  # 获取帧率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取帧宽度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 获取帧高度
 
# 对每个场景进行切割并保存为 MP4
for i, scene in enumerate(modified_scene_list):
    start_frame = scene[0].get_frames()
    end_frame = scene[1].get_frames()
    
    # 设置视频读取的起始位置
    cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)
    
    # 创建一个 VideoWriter 对象,用于保存当前场景为新的 MP4 文件
    output_filename = f'scene_{i+1}.mp4'
    fourcc = cv2.VideoWriter_fourcc(*'H264')  # 使用 H.264 编码器
    out = cv2.VideoWriter(output_filename, fourcc, fps, (frame_width, frame_height))  # 视频分辨率
    
    # 读取每一帧并写入到输出文件中
    for frame_num in range(start_frame, end_frame):
        ret, frame = cap.read()
        if not ret:
            break
        out.write(frame)
 
    # 释放 VideoWriter 和 VideoCapture 对象
    out.release()
 
    print(f'Scene {i+1} has been saved as {output_filename}')
 
# 释放 VideoCapture 对象
cap.release()