本文目录导读:

我来分享几个Python视频剪辑的实用案例,使用moviepy库来实现。
安装依赖
pip install moviepy
案例1:基础剪辑 - 截取视频片段
from moviepy.editor import VideoFileClip
import os
def cut_video(input_path, output_path, start_time, end_time):
"""
截取视频片段
:param input_path: 输入视频路径
:param output_path: 输出视频路径
:param start_time: 开始时间(秒)
:param end_time: 结束时间(秒)
"""
try:
# 加载视频
video = VideoFileClip(input_path)
# 截取片段
clip = video.subclip(start_time, end_time)
# 输出视频
clip.write_videofile(output_path, codec='libx264', audio_codec='aac')
# 释放资源
video.close()
clip.close()
print(f"视频片段已保存到: {output_path}")
except Exception as e:
print(f"处理失败: {e}")
# 使用示例
cut_video('input.mp4', 'output_cut.mp4', 10, 30) # 截取10-30秒
案例2:合并多个视频
from moviepy.editor import VideoFileClip, concatenate_videoclips
def merge_videos(video_paths, output_path):
"""
合并多个视频
:param video_paths: 视频路径列表
:param output_path: 输出路径
"""
clips = []
try:
# 加载所有视频
for path in video_paths:
if os.path.exists(path):
clip = VideoFileClip(path)
clips.append(clip)
print(f"已加载: {path}")
if not clips:
print("没有有效的视频文件")
return
# 合并视频
final_clip = concatenate_videoclips(clips, method="compose")
# 输出合并后的视频
final_clip.write_videofile(output_path, codec='libx264', audio_codec='aac')
# 释放资源
for clip in clips:
clip.close()
final_clip.close()
print(f"合并视频已保存到: {output_path}")
except Exception as e:
print(f"合并失败: {e}")
# 使用示例
videos = ['clip1.mp4', 'clip2.mp4', 'clip3.mp4']
merge_videos(videos, 'merged_video.mp4')
案例3:添加文字水印
from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip
def add_text_watermark(input_path, output_path, text, position='bottom'):
"""
添加文字水印
:param input_path: 输入视频
:param output_path: 输出视频
:param text: 水印文字
:param position: 位置 (top, bottom, left, right, center)
"""
try:
# 加载视频
video = VideoFileClip(input_path)
# 创建文字剪辑
txt_clip = TextClip(text, fontsize=30, color='white', font='SimHei')
txt_clip = txt_clip.set_duration(video.duration)
# 设置位置
positions = {
'top': ('center', 20),
'bottom': ('center', video.h - 50),
'left': (20, 'center'),
'right': (video.w - 200, 'center'),
'center': ('center', 'center')
}
txt_clip = txt_clip.set_position(positions.get(position, ('center', 'bottom')))
# 合成视频
final = CompositeVideoClip([video, txt_clip])
# 输出
final.write_videofile(output_path, codec='libx264', audio_codec='aac')
video.close()
final.close()
print(f"水印视频已保存到: {output_path}")
except Exception as e:
print(f"添加水印失败: {e}")
# 使用示例
add_text_watermark('input.mp4', 'watermarked.mp4', '我的视频水印', 'bottom')
案例4:调整视频速度
from moviepy.editor import VideoFileClip
def speed_up_video(input_path, output_path, speed_factor):
"""
调整视频速度
:param input_path: 输入视频
:param output_path: 输出视频
:param speed_factor: 速度系数 (>1加快, <1减慢)
"""
try:
video = VideoFileClip(input_path)
# 调整速度
sped_up = video.fx(vfx.speedx, speed_factor)
# 输出
sped_up.write_videofile(output_path, codec='libx264', audio_codec='aac')
video.close()
sped_up.close()
print(f"速度调整完成: {speed_factor}x")
except Exception as e:
print(f"速度调整失败: {e}")
from moviepy.editor import vfx
# 使用示例
speed_up_video('input.mp4', 'fast_video.mp4', 2.0) # 2倍速
speed_up_video('input.mp4', 'slow_video.mp4', 0.5) # 0.5倍速
案例5:批量处理视频
import os
from moviepy.editor import VideoFileClip
def batch_process_videos(input_dir, output_dir, start_time, end_time):
"""
批量剪辑视频
:param input_dir: 输入目录
:param output_dir: 输出目录
:param start_time: 开始时间
:param end_time: 结束时间
"""
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 获取所有视频文件
video_extensions = ('.mp4', '.avi', '.mov', '.mkv', '.flv')
videos = [f for f in os.listdir(input_dir)
if f.lower().endswith(video_extensions)]
for video_file in videos:
input_path = os.path.join(input_dir, video_file)
output_path = os.path.join(output_dir, f"cut_{video_file}")
try:
video = VideoFileClip(input_path)
clip = video.subclip(start_time, end_time)
clip.write_videofile(output_path, codec='libx264', audio_codec='aac')
video.close()
clip.close()
print(f"处理完成: {video_file}")
except Exception as e:
print(f"处理失败 {video_file}: {e}")
# 使用示例
batch_process_videos('input_folder', 'output_folder', 5, 20)
案例6:视频裁剪和缩放
from moviepy.editor import VideoFileClip
def crop_and_resize(input_path, output_path, width=None, height=None):
"""
裁剪和调整视频尺寸
:param input_path: 输入视频
:param output_path: 输出视频
:param width: 目标宽度
:param height: 目标高度
"""
try:
video = VideoFileClip(input_path)
# 裁剪中心区域
cropped = video.crop(x_center=video.w/2, y_center=video.h/2,
width=video.w*0.8, height=video.h*0.8)
# 调整大小
if width and height:
resized = cropped.resize((width, height))
else:
resized = cropped
# 输出
resized.write_videofile(output_path, codec='libx264', audio_codec='aac')
video.close()
resized.close()
print(f"视频裁剪完成: {output_path}")
except Exception as e:
print(f"裁剪失败: {e}")
# 使用示例
crop_and_resize('input.mp4', 'cropped.mp4', width=640, height=480)
完整示例:视频剪辑工具
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import argparse
from moviepy.editor import VideoFileClip, concatenate_videoclips, TextClip, CompositeVideoClip, vfx
class VideoEditor:
"""视频编辑工具类"""
def __init__(self):
self.supported_formats = ('.mp4', '.avi', '.mov', '.mkv', '.flv', '.wmv')
def clip(self, input_path, output_path, start, end):
"""剪切视频"""
try:
video = VideoFileClip(input_path)
clip = video.subclip(start, end)
clip.write_videofile(output_path, codec='libx264', audio_codec='aac')
video.close()
clip.close()
print(f"✓ 视频剪切成功: {output_path}")
except Exception as e:
print(f"✗ 剪切失败: {e}")
def merge(self, video_list, output_path):
"""合并视频"""
try:
clips = [VideoFileClip(v) for v in video_list if os.path.exists(v)]
if not clips:
print("没有有效的视频文件")
return
final = concatenate_videoclips(clips)
final.write_videofile(output_path, codec='libx264', audio_codec='aac')
for c in clips:
c.close()
final.close()
print(f"✓ 视频合并成功: {output_path}")
except Exception as e:
print(f"✗ 合并失败: {e}")
def speed(self, input_path, output_path, factor):
"""调整速度"""
try:
video = VideoFileClip(input_path)
sped = video.fx(vfx.speedx, factor)
sped.write_videofile(output_path, codec='libx264', audio_codec='aac')
video.close()
sped.close()
print(f"✓ 速度调整完成: {factor}x")
except Exception as e:
print(f"✗ 速度调整失败: {e}")
def add_text(self, input_path, output_path, text, position='bottom'):
"""添加文字"""
try:
video = VideoFileClip(input_path)
txt = TextClip(text, fontsize=30, color='white', font='SimHei')
txt = txt.set_duration(video.duration)
positions = {
'top': ('center', 20),
'bottom': ('center', video.h - 50),
'left': (20, 'center'),
'right': (video.w - 200, 'center'),
'center': ('center', 'center')
}
txt = txt.set_position(positions.get(position, ('center', 'bottom')))
final = CompositeVideoClip([video, txt])
final.write_videofile(output_path, codec='libx264', audio_codec='aac')
video.close()
final.close()
print(f"✓ 文字添加成功")
except Exception as e:
print(f"✗ 文字添加失败: {e}")
def main():
parser = argparse.ArgumentParser(description='视频剪辑工具')
parser.add_argument('action', choices=['clip', 'merge', 'speed', 'text'],
help='操作类型')
parser.add_argument('-i', '--input', help='输入视频路径')
parser.add_argument('-o', '--output', default='output.mp4', help='输出视频路径')
parser.add_argument('-s', '--start', type=float, help='开始时间(秒)')
parser.add_argument('-e', '--end', type=float, help='结束时间(秒)')
parser.add_argument('-f', '--factor', type=float, help='速度系数')
parser.add_argument('-t', '--text', help='文字内容')
parser.add_argument('-p', '--position', default='bottom',
choices=['top', 'bottom', 'left', 'right', 'center'],
help='文字位置')
parser.add_argument('--videos', nargs='+', help='合并的视频列表')
args = parser.parse_args()
editor = VideoEditor()
if args.action == 'clip':
if not all([args.input, args.start is not None, args.end is not None]):
print("剪辑需要输入路径、开始和结束时间")
return
editor.clip(args.input, args.output, args.start, args.end)
elif args.action == 'merge':
if not args.videos:
print("合并需要视频列表")
return
editor.merge(args.videos, args.output)
elif args.action == 'speed':
if not all([args.input, args.factor]):
print("调速需要输入路径和速度系数")
return
editor.speed(args.input, args.output, args.factor)
elif args.action == 'text':
if not all([args.input, args.text]):
print("添加文字需要输入路径和文字内容")
return
editor.add_text(args.input, args.output, args.text, args.position)
if __name__ == '__main__':
main()
使用命令行工具
# 剪切视频 python video_editor.py clip -i input.mp4 -o clip.mp4 -s 10 -e 30 # 合并视频 python video_editor.py merge --videos 1.mp4 2.mp4 3.mp4 -o merged.mp4 # 调整速度 python video_editor.py speed -i input.mp4 -o fast.mp4 -f 2.0 # 添加文字 python video_editor.py text -i input.mp4 -o text.mp4 -t "Hello World" -p bottom
注意事项
- 性能优化:处理大视频时注意内存使用
- 格式兼容:不同格式可能需要额外编码器
- 临时文件:大视频处理会创建临时文件
- 音视频同步:剪辑时注意保持音视频同步
这些案例涵盖了常见的视频剪辑需求,可以根据实际需要调整参数,如果需要处理更复杂的视频,可以考虑使用OpenCV或FFmpeg。