如何用脚本拼接视频

wen 实用脚本 2

本文目录导读:

如何用脚本拼接视频

  1. FFmpeg 脚本方法(最推荐)
  2. Python 脚本
  3. 批量处理多个文件夹的脚本
  4. 带转场效果的Python脚本
  5. 注意事项

我来介绍几种用脚本拼接视频的方法,主要涵盖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()

注意事项

  1. 视频格式统一:最好使用相同分辨率、编码和帧率的视频
  2. 音频处理:注意音频采样率的一致性
  3. 内存管理:处理大文件时注意内存使用
  4. 错误处理:始终添加异常处理逻辑
  5. 文件顺序:确保拼接顺序正确

选择哪种方法取决于你的具体需求:如果只是简单拼接,推荐FFmpeg;如果需要复杂处理(转场、调速等),推荐moviepy。

抱歉,评论功能暂时关闭!