本文目录导读:

我来介绍几种用脚本拼接视频的方法,主要涵盖FFmpeg、Python和Shell脚本三种方式。
FFmpeg 脚本方法(最推荐)
方法A:使用 concat 协议(同格式同编码)
# 创建文件列表 cat > filelist.txt << EOF file 'video1.mp4' file 'video2.mp4' file 'video3.mp4' EOF # 拼接视频 ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
方法B:使用 concat 过滤器(不同编码格式)
ffmpeg -i video1.mp4 -i video2.mp4 -i video3.mp4 \ -filter_complex "[0:v][0:a][1:v][1:a][2:v][2:a]concat=n=3:v=1:a=1[v][a]" \ -map "[v]" -map "[a]" output.mp4
方法C:Shell 循环批量拼接
#!/bin/bash
# batch_concat.sh
# 设置参数
input_dir="input_videos"
output_file="output.mp4"
filelist="temp_filelist.txt"
# 生成文件列表
for file in "$input_dir"/*.mp4; do
echo "file '$file'" >> "$filelist"
done
# 执行拼接
ffmpeg -f concat -safe 0 -i "$filelist" -c copy "$output_file"
# 清理临时文件
rm "$filelist"
echo "视频拼接完成: $output_file"
Python 脚本
使用 subprocess 调用 FFmpeg
import subprocess
import os
from pathlib import Path
def concat_videos_ffmpeg(video_list, output_path):
"""使用FFmpeg拼接视频"""
# 创建临时文件列表
temp_list = "temp_filelist.txt"
with open(temp_list, 'w') as f:
for video in video_list:
f.write(f"file '{video}'\n")
# FFmpeg命令
cmd = [
'ffmpeg',
'-f', 'concat',
'-safe', '0',
'-i', temp_list,
'-c', 'copy',
output_path
]
try:
subprocess.run(cmd, check=True)
print(f"视频拼接成功: {output_path}")
except subprocess.CalledProcessError as e:
print(f"视频拼接失败: {e}")
finally:
# 清理临时文件
if os.path.exists(temp_list):
os.remove(temp_list)
# 使用方法
videos = ['video1.mp4', 'video2.mp4', 'video3.mp4']
concat_videos_ffmpeg(videos, 'output.mp4')
使用 moviepy 库
from moviepy.editor import VideoFileClip, concatenate_videoclips
import os
def concat_videos_moviepy(video_paths, output_path):
"""使用moviepy拼接视频"""
try:
# 读取所有视频
clips = []
for video_path in video_paths:
clip = VideoFileClip(video_path)
clips.append(clip)
# 拼接视频
final_clip = concatenate_videoclips(clips, method="compose")
# 输出视频
final_clip.write_videofile(
output_path,
codec='libx264',
audio_codec='aac',
fps=24
)
# 释放资源
final_clip.close()
for clip in clips:
clip.close()
print(f"视频拼接成功: {output_path}")
except Exception as e:
print(f"视频拼接失败: {e}")
# 使用方法
videos = ['video1.mp4', 'video2.mp4', 'video3.mp4']
concat_videos_moviepy(videos, 'output.mp4')
批量处理多个文件夹的脚本
import subprocess
import os
from pathlib import Path
def batch_concat_videos(root_dir):
"""批量拼接每个子文件夹中的视频"""
root_path = Path(root_dir)
for folder in root_path.iterdir():
if folder.is_dir():
# 获取文件夹中的所有视频文件
videos = list(folder.glob("*.mp4")) + list(folder.glob("*.avi"))
videos.sort() # 按名称排序
if len(videos) > 1:
print(f"正在拼接文件夹: {folder.name}")
# 生成输出文件名
output_file = folder.parent / f"{folder.name}_concat.mp4"
# 创建临时文件列表
temp_list = folder / "temp_list.txt"
with open(temp_list, 'w') as f:
for video in videos:
f.write(f"file '{video}'\n")
# 执行拼接
cmd = [
'ffmpeg', '-f', 'concat', '-safe', '0',
'-i', str(temp_list), '-c', 'copy',
str(output_file)
]
try:
subprocess.run(cmd, check=True)
print(f"拼接完成: {output_file}")
except subprocess.CalledProcessError as e:
print(f"拼接失败: {folder.name} - {e}")
# 清理
temp_list.unlink()
# 使用方法
batch_concat_videos("videos_root_dir")
带转场效果的Python脚本
from moviepy.editor import VideoFileClip, concatenate_videoclips, CompositeVideoClip, transitions
def concat_with_transitions(video_paths, output_path, transition_duration=0.5):
"""带转场效果的视频拼接"""
clips = []
for path in video_paths:
clip = VideoFileClip(path)
clips.append(clip)
# 应用转场效果
for i in range(len(clips) - 1):
clips[i] = clips[i].crossfadein(transition_duration)
clips[i+1] = clips[i+1].crossfadeout(transition_duration)
# 拼接
final_clip = concatenate_videoclips(clips, method="compose")
# 输出
final_clip.write_videofile(
output_path,
fps=24,
codec='libx264',
audio_codec='aac'
)
# 清理
for clip in clips:
clip.close()
final_clip.close()
注意事项
- 视频格式统一:最好使用相同分辨率、编码和帧率的视频
- 音频处理:注意音频采样率的一致性
- 内存管理:处理大文件时注意内存使用
- 错误处理:始终添加异常处理逻辑
- 文件顺序:确保拼接顺序正确
选择哪种方法取决于你的具体需求:如果只是简单拼接,推荐FFmpeg;如果需要复杂处理(转场、调速等),推荐moviepy。