FFMPeg是一个开元的音视频处理工具集。一般作为命令行工具进行使用(ffmpeg转码工具、ffprobe媒体分析工具、ffplay播放器)。
主要功能:格式转换、编码/解码、流处理、编辑处理(剪辑/合并/过滤)、元数据、设备采集(摄像头、麦克风捕获)、质量分析(音视频质量检测)
可以看下 ffmpeg官网
一、直接通过命令使用(subprocess调用)
FFMPeg本身是一个命令行工具,通过subprocess模块实现ffmpeg的命令,从而完成在python中对ffmpeg工具的调用。
python
import subprocess
import os
# 基本格式转换
def convert_video(input_path, output_path):
cmd = [
'ffmpeg',
'-i', input_path, # 输入文件
'-c:v', 'libx264', # 视频编码器
'-c:a', 'aac', # 音频编码器
output_path
]
subprocess.run(cmd)
# 调整视频分辨率
def resize_video(input_path, output_path, width, height):
cmd = [
'ffmpeg',
'-i', input_path,
'-vf', f'scale={width}:{height}', # 调整分辨率
'-c:a', 'copy', # 音频直接复制
output_path
]
subprocess.run(cmd)
# 提取视频中的音频
def extract_audio(input_path, output_path):
cmd = [
'ffmpeg',
'-i', input_path,
'-vn', # 忽略视频
'-acodec', 'mp3', # 音频编码
output_path
]
subprocess.run(cmd)
# 获取视频信息
def get_video_info(input_path):
cmd = [
'ffprobe',
'-v', 'error',
'-show_format',
'-show_streams',
input_path
]
result = subprocess.run(cmd, capture_output=True, text=True)
return result.stdout
二、使用ffmpeg的相关库
ffmpeg-python库和moviepy库都是依赖ffmpeg构建的两个库:ffmpeg-python是对FFmpeg命令的python接口,MoviePy 内部调用 FFmpeg。

| 特性 | FFmpeg-Python | MoviePy |
|---|---|---|
| 适用场景 | FFmpeg命令行替代,复杂滤镜 | 高级视频编辑,特效制作 |
| 学习曲线 | 中等(需了解FFmpeg) | 较低(Pythonic API) |
| 性能 | 高(直接调用FFmpeg) | 中等(Python层处理) |
| 实时预览 | 不支持 | 支持(Jupyter) |
| 自定义程度 | 高(所有FFmpeg功能) | 中等(封装好的功能) |
| 内存使用 | 低(流式处理) | 高(常加载全文件) |
| 选择建议 | 需要精确控制FFmpeg参数 处理流媒体或直播 需要复杂滤镜链 追求最高性能 | 需要快速原型开发 进行复杂的时间线编辑 需要实时预览效果 结合NumPy/OpenCV进行图像处理 在Jupyter中进行交互式编辑 |
1、使用ffmpeg-python库进行调用
通过 pip install ffmpeg-python 命令下载该库。FFmpeg-Python 是一个 FFmpeg 命令的Python包装器,它提供链式调用语法、类型安全机制。能够直接对应ffmpeg的命令。
其核心流程是:input输入 -> filter处理 -> output输出.-> run执行。
python
# 1. 视频滤镜链
(
ffmpeg
.input('input.mp4')
.filter('scale', width=1280, height=720) # 调整大小
.filter('fps', fps=30, round='up') # 调整帧率
.filter('crop', w=640, h=480, x=100, y=100) # 裁剪
.filter('hflip') # 水平翻转
.filter('vflip') # 垂直翻转
.filter('rotate', angle=45*PI/180) # 旋转
.filter('unsharp', luma_msize_x=5, luma_amount=1.0) # 锐化
.filter('eq', brightness=0.1, contrast=1.1) # 亮度对比度
.output('output.mp4')
.run()
)
# 2. 复杂滤镜图(多个流处理)
split_stream = ffmpeg.input('input.mp4').filter_multi_output('split')
stream1 = split_stream[0].filter('hflip')
stream2 = split_stream[1].filter('vflip')
# 并排显示
overlay_stream = ffmpeg.filter([stream1, stream2], 'hstack')
# 3. 画中画效果
main_video = ffmpeg.input('main.mp4')
pip_video = ffmpeg.input('pip.mp4').filter('scale', 320, 180)
(
ffmpeg
.filter([main_video, pip_video], 'overlay',
x='main_w-overlay_w-10', # 右上角
y=10)
.output('output.mp4')
.run()
)
# 音频滤镜链
(
ffmpeg
.input('audio.wav')
.filter('volume', volume=1.5) # 音量调整
.filter('afade', type='in', duration=2) # 淡入
.filter('afade', type='out', start_time=58, duration=2) # 淡出
.filter('highpass', frequency=100) # 高通滤波
.filter('lowpass', frequency=3000) # 低通滤波
.filter('equalizer', f=1000, width_type='h', width=100, gain=10) # EQ
.filter('atempo', tempo=1.5) # 变速不变调
.filter('aecho', in_gain=0.8, out_gain=0.9,
delays=60, decays=0.4) # 回声
.output('processed_audio.wav')
.run()
)
2、使用MoviePy库进行编辑
通过 pip install moviepy 命令下载库,该库面向对象设计,支持Numpy数据直接操作。其核心对象模型有
- VideoFileClip("video.mp4") 视频剪辑对象
- AudioFileClip("audio.mp3")音频剪辑对象
- TextClip("Hello")文字剪辑对象
- ImageClip ("image.png ") 图片剪辑对象
- CompositeVideoClip([clip, text.set_position('center')])组合剪辑对象
python
from moviepy.editor import *
import numpy as np
# 1. 视频加载和基础操作
clip = VideoFileClip("input.mp4")
# 基础属性
print(f"时长: {clip.duration}秒")
print(f"大小: {clip.size}")
print(f"帧率: {clip.fps}")
# 时间线操作
clip_sub = clip.subclip(10, 20) # 截取10-20秒
clip_speed = clip.speedx(2) # 2倍速
clip_reverse = clip.fx(vfx.time_mirror) # 倒放
clip_loop = clip.loop(duration=30) # 循环到30秒
# 视觉效果
clip_bw = clip.fx(vfx.blackwhite) # 黑白
clip_invert = clip.fx(vfx.invert_colors) # 反色
clip_fadein = clip.fx(vfx.fadein, duration=2) # 淡入
clip_fadeout = clip.fx(vfx.fadeout, duration=2)# 淡出
# 变换效果
clip_rotated = clip.fx(vfx.rotate, angle=30) # 旋转
clip_scroll = clip.fx(vfx.scroll, h=100, w=50) # 滚动
clip_mirror_x = clip.fx(vfx.mirror_x) # X轴镜像
clip_mirror_y = clip.fx(vfx.mirror_y) # Y轴镜像
# 2. 复杂时间线编辑
clip1 = VideoFileClip("video1.mp4").subclip(0, 5)
clip2 = VideoFileClip("video2.mp4").subclip(0, 5)
clip3 = VideoFileClip("video3.mp4").subclip(0, 5)
# 拼接方式1
concatenated = concatenate_videoclips([clip1, clip2, clip3],
method="compose") # 自动调整尺寸
# 拼接方式2
concatenated = clip1.concat(clip2).concat(clip3)
# 3. 图层合成(类似Photoshop)
background = VideoFileClip("bg.mp4")
foreground1 = VideoFileClip("fg1.mp4").set_position(('center', 'top'))
foreground2 = ImageClip("logo.png").set_duration(10).set_position(('right', 'bottom'))
composite = CompositeVideoClip([
background,
foreground1,
foreground2
], size=background.size)