需求

把目录里的视频合成一个 而且不会乱跳

代码

亲测可用

from moviepy.editor import VideoFileClip, concatenate_videoclips


def preprocess_clip(clip, target_fps=30, target_size=(1280, 720)):
    """
    预处理视频片段,设置新的帧率和分辨率。

    注意:这里的帧率调整可能只是改变了播放时的假设帧率,
    并没有真正地重新采样视频帧。

    :param clip: VideoFileClip对象
    :param target_fps: 目标帧率
    :param target_size: 目标分辨率(宽度, 高度)
    :return: 处理后的VideoFileClip对象
    """
    # 尽可能调整帧率(但实际上只是改变了播放速度)
    # 如果需要真正的帧率调整,请考虑使用ffmpeg
    clip = clip.set_fps(target_fps)

    # 调整分辨率
    clip = clip.resize(newsize=target_size)

    return clip


def merge_video_clips(input_dir, output_path, target_fps=30, target_size=(1280, 720)):
    """
    合并指定目录下的所有视频片段为一个长视频,并进行预处理。

    :param input_dir: 包含视频片段的目录地址
    :param output_path: 合并后视频的保存地址
    :param target_fps: 目标帧率
    :param target_size: 目标分辨率(宽度, 高度)
    :return: None
    """
    try:
        import os

        # 获取目录下所有视频文件的列表
        video_files = [f for f in sorted(os.listdir(input_dir)) if f.endswith(('.mp4', '.avi', '.mov'))]
        video_clips = []

        # 遍历视频文件列表,加载并预处理每个视频片段
        for video_file in video_files:
            video_path = os.path.join(input_dir, video_file)
            clip = VideoFileClip(video_path)
            clip = preprocess_clip(clip, target_fps, target_size)
            video_clips.append(clip)

            # 合并视频片段
        final_clip = concatenate_videoclips(video_clips)

        # 导出合并后的视频
        # 注意:这里我们再次指定fps,以确保输出视频具有正确的帧率
        final_clip.write_videofile(output_path, codec='libx264', fps=target_fps)

        print(f"视频已成功合并并保存至 {output_path}")

    except Exception as e:
        print(f"合并视频时发生错误: {e}")

    # 使用示例


input_dir = r'D:\temp\20240902_002611 鲸鱼编程 开学的旅程'
output_path = r'C:\Users\merged_video55.mp4'
merge_video_clips(input_dir, output_path, target_fps=25, target_size=(1080, 1920))