如何使用Moviepy合并指定目录下的所有视频文件【已解决】
Python+MoviePy按文件名序号合并目录内视频的实现方法
你不能直接将目录路径传入concatenate_videoclips()完成合并——这个函数的入参要求是按拼接顺序排列的VideoFileClip对象列表,不支持直接传入文件夹路径,直接传路径会触发类型错误。
以下是可直接运行的完整实现,自动适配file1、file2...fileN这种命名规则的文件,还能避免默认字典序导致file10排在file2前面的排序错乱问题:
前置依赖
先确保已经安装moviepy库:
pip install moviepy
完整实现代码
import os import re from moviepy.editor import VideoFileClip, concatenate_videoclips # -------------------------- 配置项 按需修改 -------------------------- TARGET_VIDEO_DIR = "./your_video_folder" # 替换为你存放视频的目标目录路径 OUTPUT_VIDEO_PATH = "./merged_final.mp4" # 合并后视频的保存路径 SUPPORTED_VIDEO_FORMATS = (".mp4", ".mov", ".avi", ".mkv", ".flv") # 要识别的视频后缀 # -------------------------------------------------------------------- # 遍历目录筛选所有符合格式的视频文件 video_path_list = [] for file_name in os.listdir(TARGET_VIDEO_DIR): file_suffix = os.path.splitext(file_name)[1].lower() if file_suffix in SUPPORTED_VIDEO_FORMATS: full_path = os.path.join(TARGET_VIDEO_DIR, file_name) video_path_list.append(full_path) # 按文件名中的数字序号排序 def extract_seq_num(file_full_path): base_name = os.path.basename(file_full_path) num_match = re.search(r"\d+", base_name) # 文件名没有数字的默认排最前面 return int(num_match.group()) if num_match else 0 video_path_list.sort(key=extract_seq_num) # 加载所有视频片段 clip_list = [VideoFileClip(path) for path in video_path_list] # 执行拼接 final_video = concatenate_videoclips(clip_list, method="compose") # 导出合并后的视频 final_video.write_videofile(OUTPUT_VIDEO_PATH) # 释放占用的内存 for clip in clip_list: clip.close() final_video.close()
踩坑提示:不要直接用os.listdir返回的默认顺序加载视频,操作系统默认返回的文件顺序不保证按数字序号排列,不做自定义排序很容易出现拼接顺序错乱的问题。
使用说明
- 如果目录下所有视频的分辨率、帧率、编码格式完全一致,可以把
concatenate_videoclips的method参数改为"chain",拼接速度会大幅提升,不需要做转码适配 - 如果视频参数不统一,保持
method="compose"即可,程序会自动统一参数,避免输出视频花屏、音画不同步
注意:运行前记得把配置项里的目录路径改成你自己的实际路径
内容的提问来源于stack exchange,提问作者Sting3r
相关产品推荐
相关产品推荐

