Share

视频里面章节,章节之间有一个10秒的空白 用python 章节分离出来

import cv2
from moviepy.editor import VideoFileClip
import numpy as np
import os

# 视频文件路径
video_path = 'test1.mp4'

# 初始化视频读取器
cap = cv2.VideoCapture(video_path)

# 检查视频是否成功打开
if not cap.isOpened():
    print("Error: Could not open video.")
    exit()

# 初始化变量
frame_rate = cap.get(cv2.CAP_PROP_FPS)  # 获取帧率
blank_duration_threshold = frame_rate * 10  # 空白持续时间阈值,单位为帧(假设10秒)
start_time = 0  # 当前章节的开始时间
blank_start_time = None  # 空白部分的开始时间
chapters = []  # 存储章节的列表

# 读取视频帧
frame_count = 0
while True:
    ret, frame = cap.read()
    if not ret:
        break  # 如果没有帧了,退出循环

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 转换为灰度图
    _, frame_without_blank = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY)  # 二值化处理

    if np.sum(frame_without_blank) == 0:  # 检测空白帧
        if blank_start_time is None:
            blank_start_time = frame_count
    else:
        if blank_start_time is not None:
            # 检测到非空白帧,检查空白帧持续时间是否超过阈值
            if (frame_count - blank_start_time) >= blank_duration_threshold:
                end_time = (frame_count - 1) / frame_rate
                chapters.append((start_time, end_time))
                start_time = frame_count / frame_rate  # 设置新章节的开始时间
            blank_start_time = None

    # 更新帧计数
    frame_count += 1

# 处理视频末尾的章节
if chapters and chapters[-1][1] < frame_count / frame_rate:
    chapters[-1] = (chapters[-1][0], frame_count / frame_rate)

# 释放视频读取器
cap.release()

# 使用moviepy分割视频
if chapters:
    video = VideoFileClip(video_path)
    for i, (start, end) in enumerate(chapters):
        chapter_clip = video.subclip(start, end)
        chapter_clip.write_videofile(f"chapter_{i+1}.mp4", codec="libx264")
        print(f"Chapter {i+1} saved as chapter_{i+1}.mp4")
    video.close()
else:
    print("No chapters found.")

执行第二个脚本。去掉视频结尾17秒

import os
from moviepy.editor import VideoFileClip

def trim_video(file_path, output_path, duration_to_trim):
    # 打开视频文件
    clip = VideoFileClip(file_path)
    
    # 获取视频总时长
    video_duration = clip.duration
    
    # 计算要删除的起始时间点,即视频总时长减去要删除的时长
    start_trim_time = video_duration - duration_to_trim
    
    # 截取视频,不包括最后10秒
    if start_trim_time > 0:
        clip_without_end = clip.subclip(0, start_trim_time)
    else:
        print("视频时长不足以删除10秒")
        return
    
    # 写入新视频
    clip_without_end.write_videofile(output_path, codec='libx264')
    
    # 关闭clip
    clip_without_end.close()
    clip.close()

def process_directory(directory):
    # 遍历目录下的所有文件
    for filename in os.listdir(directory):
        if filename.endswith('.mp4'):  # 假设视频文件是mp4格式
            file_path = os.path.join(directory, filename)
            output_path = os.path.join(directory, f"trimmed_{filename}")
            
            # 定义要删除的时长为10秒
            duration_to_trim = 17  # 10秒
            
            # 处理视频
            trim_video(file_path, output_path, duration_to_trim)
            print(f"处理完成: {filename}")

# 指定视频文件所在的目录
directory_path = '.'

# 调用函数处理目录
process_directory(directory_path)