import os
from moviepy.editor import VideoFileClip, concatenate_videoclips
def merge_videos_in_folder(folder_path, output_file, transition_duration=1):
# 获取文件夹中所有视频文件,并按数字顺序排序
video_files = sorted(
[f for f in os.listdir(folder_path) if f.endswith(('.mp4', '.mov', '.avi'))],
key=lambda x: int(os.path.splitext(x)[0])
)
# 检查文件夹是否为空
if not video_files:
print("文件夹中没有视频文件。")
return
clips = []
for video_file in video_files:
video_path = os.path.join(folder_path, video_file)
video_clip = VideoFileClip(video_path)
# 添加淡入淡出效果
video_clip = video_clip.fadein(transition_duration).fadeout(transition_duration)
# 保留音频
clips.append(video_clip.set_audio(video_clip.audio))
# 合并视频
final_video = concatenate_videoclips(clips, method="compose")
# 输出合成后的视频
final_video.write_videofile(output_file, codec="libx264", audio_codec="aac")
print(f"视频合成完成,输出文件为: {output_file}")
# 示例用法
folder_path = " # 替换为你的文件夹路径
output_file = "
merge_videos_in_folder(folder_path, output_file)
代码解析
-
导入必要的库:
os
用于处理文件和目录。moviepy.editor
提供视频处理的功能。
-
定义函数:
merge_videos_in_folder(folder_path, output_file, transition_duration=1)
:这个函数接收视频文件夹路径、输出文件路径和过渡时长作为参数。
-
获取视频文件:
- 使用
os.listdir()
获取文件夹中的所有视频文件,并按文件名中的数字进行排序。
- 使用
-
检查文件夹:
- 如果没有找到视频文件,输出提示信息并返回。
-
处理每个视频:
- 使用
VideoFileClip
加载每个视频文件,添加淡入淡出效果,并保留音频。
- 使用
-
合并视频:
- 使用
concatenate_videoclips()
合并所有视频片段。
- 使用
-
输出结果:
- 使用
write_videofile()
保存最终合成的视频。
- 使用
使用示例
在代码的最后,你可以根据自己的需要替换 folder_path
和 output_file
的值,运行代码即可合并指定文件夹中的视频文件,并生成一个新的合成视频。