ffmpeg 基础教程
- uvim管理员
FFmpeg 被称为“多媒体界的瑞士军刀”,它功能极其强大,但学习曲线确实较陡峭。
要学好 FFmpeg,不能只背命令,而要理解它的核心架构。下面我将为你梳理出一份从入门到进阶的全景式教程路线图。
一、 核心概念:FFmpeg 如何处理视频?
在操作之前,你需要理解数据流向的四个步骤:
1. 解封装 (Demuxing):把封装好的容器(如 MP4, MKV)拆解,提取出原始的视频流、音频流和字幕流。
2. 解码 (Decoding):把压缩的编码数据(如 H.264, AAC)还原成原始的图像帧(YUV/RGB)和采样数据(PCM)。
3. 滤镜/编码 (Filtering/Encoding):对视频进行缩放、水印等处理,或者使用新的编码器进行压缩。
4. 封装 (Muxing):把处理好的音视频重新塞进特定的容器里。二、 最核心的命令结构
无论多复杂的命令,都离不开这个语法格式:
ffmpeg -i [输入路径] [参数选项] [输出路径]-i:输入文件。-c:v(或-vcodec):设置视频编码器(如libx264,copy表示直接拷贝不重新编码)。-c:a(或-acodec):设置音频编码器(如aac)。-b:v:设置视频码率。-vf:视频滤镜(Video Filter)。
三、 常见的高频操作(实战篇)
1. 无损剪切与合并(极速)
如果不重新编码,使用
-c copy,速度极快且无画质损失。
* 截取视频片段:从第 10 秒开始,截取 5 秒长。
ffmpeg -i input.mp4 -ss 00:00:10 -t 5 -c copy output.mp4
* 合并视频:先创建一个list.txt,内容为file '1.mp4',然后执行:
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp42. 格式转换与压缩
- 转码:MP4 转 MKV
ffmpeg -i input.mp4 output.mkv
* 压缩视频:使用 H.264 编码,控制视频质量(CRF 值范围 0-51,18-28 是黄金区间,越小质量越好)。
ffmpeg -i input.mp4 -vcodec libx264 -crf 23 output.mp43. 画面处理(滤镜魔法)
- 缩放视频:强制缩放到 1280x720。
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
* 添加水印:将图片放在视频的坐标 (10, 10)。
ffmpeg -i input.mp4 -i logo.png -filter_complex "overlay=10:10" output.mp44. 音频操作
- 提取音频:
ffmpeg -i input.mp4 -vn -acodec copy output.aac
* 视频静音:
ffmpeg -i input.mp4 -an output.mp4四、 资深工程师的建议:进阶学习路径
1. 学会使用
ffprobe:
这是 FFmpeg 套件中的工具,专门用来分析文件元数据。在写脚本前,先用ffprobe -show_streams input.mp4查看视频编码格式、码率、帧率等信息。2. 理解硬件加速:
在生产环境中,CPU 编码效率低下。学习使用 NVIDIA 的 NVENC (通过-c:v h264_nvenc) 或 Intel 的 QSV 编码,可以将速度提升 5-10 倍。3. 管道操作 (Piping):
熟练在 Linux 环境下使用|管道,将 FFmpeg 的输出传递给其他处理逻辑,这是自动化流媒体服务器的技术基础。4. 关注性能瓶颈:
调试时使用-v error查看错误报告,使用-benchmark测量处理耗时。五、 给新手的学习资源推荐
- 官方文档:ffmpeg.org 是最权威的字典,遇到参数直接查。
- Awesome FFmpeg:在 GitHub 上搜索这个仓库,里面有各种垂直领域的最佳实践案例。
- 练习建议:别只看文档,尝试写一个 Shell 脚本,批量转换一个文件夹里的所有视频并打上日期水印。完成这个任务,你就入门了。
我将 FFmpeg 的常见用法按照业务场景进行了分类总结。你可以把这份清单当作你的“操作手册”,在遇到实际开发需求时直接查阅。
一、 媒体文件处理类(转码/封装)
1. 通用格式转换
ffmpeg -i input.avi output.mp42. 提取音频流(去视频化)
ffmpeg -i input.mp4 -vn -acodec copy output.aac3. 提取视频流(去音频化)
ffmpeg -i input.mp4 -an -vcodec copy output.mp44. 改变视频分辨率(缩放)
注意:若要保持长宽比,可使用scale=1280:-1ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4二、 内容截取与切割
1. 精确剪切片段
-ss是开始时间,-t是时长,-to是结束时间点。ffmpeg -i input.mp4 -ss 00:01:00 -t 10 -c copy output.mp42. 视频截图(提取第一帧/特定帧)
ffmpeg -i input.mp4 -ss 00:00:05 -frames:v 1 output.jpg3. 视频转为 GIF 动图
ffmpeg -i input.mp4 -ss 00:00:02 -t 3 -vf "fps=15,scale=320:-1:flags=lanczos" output.gif三、 合并与拼接
1. 多视频合并(相同编码)
创建一个inputs.txt:file 'part1.mp4' file 'part2.mp4'执行命令:
ffmpeg -f concat -safe 0 -i inputs.txt -c copy output.mp42. 音视频合并
将音频文件audio.mp3合并到视频video.mp4中:ffmpeg -i video.mp4 -i audio.mp3 -c copy -map 0:v:0 -map 1:a:0 output.mp4四、 滤镜与复杂特效(Filter)
1. 画中画(叠加)
将small.mp4叠加在big.mp4的右下角:ffmpeg -i big.mp4 -i small.mp4 -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10" output.mp42. 在视频上添加文字(水印)
需要系统支持libfreetype。ffmpeg -i input.mp4 -vf "drawtext=text='My Logo':x=10:y=10:fontsize=24:fontcolor=white" output.mp43. 视频旋转
transpose=1顺时针旋转90度。ffmpeg -i input.mp4 -vf "transpose=1" output.mp4五、 直播与流媒体(进阶场景)
1. 推流到 RTMP 服务器
将本地文件推送到直播服务器:ffmpeg -re -i input.mp4 -c copy -f flv rtmp://server/live/stream-re参数表示按原始帧率读取文件,直播推流必选。2. 采集桌面屏幕(录屏)
* Windows (gdigrab):ffmpeg -f gdigrab -i desktop output.mp4
* macOS (avfoundation):ffmpeg -f avfoundation -i "1:0" output.mp4六、 技术小贴士(工程师视角)
- 关于
-c copy:
这是最常用的优化技巧。如果只是更换容器格式(如从
.mkv转.mp4)或简单的剪切,务必加上此参数。它直接拷贝原始流数据,不进行解码和重编码,处理速度几乎由磁盘 I/O 决定,且画质零损耗。- 查看视频编码信息:
不确定视频用什么编码?用
ffprobe。ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,width,height -of default=noprint_wrappers=1 input.mp4- 如何优化压缩质量?
不要盲目调码率。使用 CRF(Constant Rate Factor),它是根据感知质量恒定画质。
-c:v libx264 -crf 23(x264 默认值是 23,范围 0-51。建议 18-28 之间,越低画质越好,体积越大)。- 硬件加速建议:
如果是生产环境处理大批量视频,使用硬件解码器可以显著降低 CPU 负载:
* NVIDIA:-c:v h264_nvenc
* Intel:-c:v h264_qsv- 关于