本文目录导读:

我来介绍几种用脚本拼接视频的方法,主要涵盖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。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播