需求
把目录里的视频合成一个 而且不会乱跳
代码
亲测可用
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))