一、FFmpeg 核心架构与处理管道全景
FFmpeg 是多媒体处理领域的工业级标准工具,集成了音视频录制、格式转码、流媒体推拉流、滤镜特效以及封装提取(Demux/Mux)等核心能力。
1. 核心处理流程模型
FFmpeg 内部采用高度模块化的流式处理流水线:
+-----------------------------------------------------------------------------------+
| 输入文件 (Container: MP4 / AVI / FLV) |
+-----------------------------------------------------------------------------------+
│ 解复用 (Demuxer: libavformat)
▼
+-----------------------------------------------------------------------------------+
| 编码数据包 (Encoded Packets: H.264 / AAC) |
+-----------------------------------------------------------------------------------+
│ 解码 (Decoder: libavcodec)
▼
+-----------------------------------------------------------------------------------+
| 原始数据帧 (Raw Frames: YUV / PCM) [可经由 libavfilter 滤镜处理] |
+-----------------------------------------------------------------------------------+
│ 编码 (Encoder: libx264 / aac)
▼
+-----------------------------------------------------------------------------------+
| 重新编码数据包 (Encoded Packets) |
+-----------------------------------------------------------------------------------+
│ 复用打包 (Muxer: libavformat)
▼
+-----------------------------------------------------------------------------------+
| 输出文件 (Container: MP4 / MKV / MP3) |
+-----------------------------------------------------------------------------------+
[!TIP] Stream Copy(极速零损耗):当指定
-c copy(或-vcodec copy -acodec copy)时,FFmpeg 会跳过中间繁重的解码与编码阶段,直接将数据包解复用后重新封装打包。原本需要几十分钟的转码可在数秒内以磁盘 IO 极限速度完成,且音画质 100% 无损!
二、常用核心参数全景速查
1. 全局与通用参数
| 参数 | 说明与用法 | 典型示例 |
|---|---|---|
-i <filename> |
指定输入文件(支持传入多个 -i 进行音视频合流) |
-i input.mp4 |
-y / -n |
-y 覆盖输出文件,-n 存在则退出不覆盖 |
ffmpeg -y -i in.mp4 out.mp4 |
-ss <time> |
指定开始截取的时间戳(支持 00:01:30 或秒数 90) |
-ss 00:00:10 |
-t <duration> |
指定截取持续时长 | -t 00:01:00 |
-to <time> |
指定截取的截止绝对时间 | -to 00:02:30 |
2. 视频控制参数 (Video)
| 参数 | 说明与用法 | 典型示例 |
|---|---|---|
-c:v / -vcodec |
设定视频编码器(copy, libx264, libx265, h264_nvenc) |
-c:v libx264 |
-b:v |
设定视频目标码率(比特率) | -b:v 2000k |
-r |
设定视频帧率(FPS,Frame Rate) | -r 30 或 -r 60 |
-s |
设定视频分辨率宽高(宽x高) |
-s 1920x1080 |
-vn |
禁用视频流(Video None,仅保留音频) | -vn |
-crf |
恒定速率因子(0~51,值越小画质越高,推荐 18~23) | -crf 23 |
3. 音频控制参数 (Audio)
| 参数 | 说明与用法 | 典型示例 |
|---|---|---|
-c:a / -acodec |
设定音频编码器(copy, aac, libmp3lame, flac) |
-c:a aac |
-b:a / -ab |
设定音频比特率 | -b:a 192k |
-ar |
设定音频采样率(Sample Rate) | -ar 44100 或 -ar 48000 |
-ac |
设定音频声道数(Channel: 1 为单声道,2 为立体声) | -ac 2 |
-an |
禁用音频流(Audio None,生成静音视频) | -an |
三、生产与日常高频实战场景速查
1. 音视频分离与独立提取
从视频中纯提取音频
# 提取无损音频流 (封装为 MP3 / AAC)
ffmpeg -i input_video.flv -vn -c:a copy output_audio.aac
# 提取并重编码为高质量 MP3
ffmpeg -i input_video.mp4 -vn -c:a libmp3lame -b:a 320k output_audio.mp3
从视频中剥离声音(生成纯静音视频)
# 零损耗剥离音轨,秒级完成
ffmpeg -i input_video.mp4 -an -c:v copy output_silent.mp4
2. 独立音频与视频轨道合并(Muxing)
将无声或已有视频轨与独立音频流重新合并为一个完整媒体文件:
# 同时输入视频与音频,原样拷贝音视频流(0 重新编码,毫秒级合并)
ffmpeg -i video.mp4 -i audio.mp3 -c:v copy -c:a aac -shortest output.mp4
[!TIP] 添加
-shortest参数可以在较短的流结束时自动截断,避免音频过长导致视频最后卡在静止黑屏。
3. 高精度截取与切片剪辑(Cut & Trim)
# 快速剪辑:从第 10 秒开始,连续截取 1 分 22 秒的内容
ffmpeg -ss 00:00:10 -i input.mp4 -t 00:01:22 -c copy output_clip.mp4
[!WARNING]
-ss放置位置决定截取精度与速度: - 放在-i之前(如上):基于关键帧快速寻址(Fast Seek),速度极快,但第一帧可能存在微小黑屏; - 放在-i之后:逐帧解码寻址,时间戳 100% 精确,但大文件会消耗更多 CPU。
4. 视频按帧截图与生成封面图
# 在视频第 8 秒处截取单张高清封面图并指定尺寸
ffmpeg -ss 00:00:08 -i input.mp4 -vframes 1 -s 1280x720 cover.jpg
# 按照每秒 1 帧的频率连续批量导出缩略图
ffmpeg -i input.mp4 -vf "fps=1" thumb_%04d.jpg
5. 屏幕录制与麦克风混音(Linux X11 桌面录屏)
基于 x11grab 设备录制桌面屏幕,并配合 ALSA / PulseAudio 拾取麦克风输入:
# 1. 录制全屏 (分辨率 1920x1080,30 FPS,画面质量预设)
ffmpeg -f x11grab -r 30 -s 1920x1080 -i :0.0+0,0 \
-c:v libx264 -preset ultrafast -crf 22 screen_record.mp4
# 2. 屏幕录像同时录制麦克风音频
ffmpeg -f x11grab -r 30 -s 1920x1080 -i :0.0 \
-f alsa -ac 2 -i pulse \
-c:v libx264 -preset ultrafast -c:a aac live_screen_with_mic.mkv
提示:在 Linux X11 环境下,可使用
xwininfo命令行工具点击特定窗口,获取其几何偏移(如+274+34)并填入-i :0.0+X,Y从而实现精确的区域/窗口录屏。
6. 多视频文件无缝拼接合并(Concatenate)
当两个视频的分辨率、编码器与帧率完全相同时,使用 concat demuxer 可实现无重新编码的秒级拼接:
# 1. 创建文件列表 filelist.txt
cat > filelist.txt << 'EOF'
file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'
EOF
# 2. 无损直接串联拼接
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output_combined.mp4