推荐使用 ffmpeg-python 处理视频,因其是 FFmpeg 命令行的轻量封装,支持流选择、链式构建、精准错误反馈;相较 OpenCV(偏视觉、编码控制弱)和 moviepy(抽象高、调试难),更灵活可靠。

用 Python 处理视频,不一定要从头写解码逻辑——FFmpeg 的 Python 绑定(如 ffmpeg-python)提供了简洁、可控又贴近原生命令行的接口,适合自动化剪辑、格式转换、抽帧、加水印等常见任务。
为什么选 ffmpeg-python 而不是 OpenCV 或 moviepy?
OpenCV 侧重计算机视觉,对编码器控制弱、不支持多路流精细操作;moviepy 抽象高但调试难、依赖多、性能开销大。而 ffmpeg-python 是 FFmpeg 命令行的 Python 封装,零额外编解码逻辑,所有参数直通 FFmpeg,灵活且可靠。
- 支持音视频分离、合并、流选择(如只处理字幕流)
- 可链式构建命令,避免字符串拼接错误
- 错误信息直接来自 FFmpeg,便于定位问题(如编码器不支持、分辨率非偶数)
- 无需手动管理临时文件,支持管道输入/输出
安装与基础用法
确保系统已安装 FFmpeg(命令行能运行 ffmpeg -version),再执行:
pip install ffmpeg-python
立即学习“Python免费学习笔记(深入)”;
最简示例:将 MP4 转为 GIF(带缩放和帧率控制):
import ffmpeg
stream = ffmpeg.input('input.mp4')\
.filter('scale', '320:-1')\
.filter('fps', fps=10)
ffmpeg.output(stream, 'output.gif').run()
注意:不调用 .run() 不会真正执行;若需捕获日志或忽略错误,可用 run(capture_stdout=True, capture_stderr=True)。
实用场景代码片段
-
提取音频并转成 MP3:
ffmpeg.input('video.mp4').output('audio.mp3', acodec='libmp3lame', ar=44100).run() -
截取中间 30 秒(从第 60 秒开始):
ffmpeg.input('video.mp4', ss=60).output('clip.mp4', t=30).run() -
给视频右上角叠加文字水印:
ffmpeg.input('in.mp4')\
.drawtext(text='MyLogo', x='w-tw-10', y=10, fontsize=24, fontcolor='white@0.8')\
.output('out.mp4').run() -
批量处理目录下所有 MP4:抽每秒一帧存为 JPG:
for f in Path('.').glob('*.mp4'):\
ffmpeg.input(f).output(f'{f.stem}_%04d.jpg', r=1).run()
避坑提醒
- 路径含中文或空格时,用
str(Path(...).resolve())转绝对路径再传入,避免 FFmpeg 解析失败 - H.265(HEVC)编码需显式指定
vcodec='libx265',否则默认可能用 H.264 - 部分滤镜(如
pad)要求宽高为 2 的倍数,可加.filter('pad', 'ceil(iw/2)*2:ceil(ih/2)*2') - 运行报错 “Protocol not found” 多因文件路径错误或协议前缀缺失(如
rtmp://地址没加协议)










