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()
|