音视频基础概念入门:封装、编码、转码、码率、帧率、分辨率、HLS
适合零基础学习 FFmpeg、视频平台开发、音视频转码前阅读。
核心目标:先搞清楚"视频文件里到底装了什么",再理解 FFmpeg 命令为什么这样写。
1. 一个视频文件不等于只有视频
很多人一开始会以为:
一个
.mp4文件 = 一段视频画面
其实不完全对。
一个视频文件里面通常可能包含:
| 内容 | 说明 |
|---|---|
| 视频画面数据 | 也就是我们看到的画面 |
| 音频声音数据 | 背景音乐、人声、环境音 |
| 字幕数据 | 中文字幕、英文字幕等 |
| 封面信息 | 视频缩略图、封面图 |
| 时间信息 | 每一帧、每一段音频的时间戳 |
| 编码信息 | 视频、音频使用了什么压缩格式 |
| 元数据 | 标题、作者、时长、旋转角度等信息 |
例如一个 movie.mp4 可能是这样:
text
文件:movie.mp4
封装格式:MP4
视频编码:H.264
音频编码:AAC
分辨率:1920x1080
帧率:30fps
视频码率:3000kbps
音频采样率:44100Hz
所以,学习音视频时要先记住一句话:
MP4、AVI、MKV 这些一般说的是"封装格式";H.264、H.265、AAC、MP3 这些一般说的是"编码格式"。
2. 核心概念总览
| 概念 | 简单理解 | 常见例子 | 重点 |
|---|---|---|---|
| 封装格式 / 容器 | 视频文件的"外壳" | MP4、AVI、MKV、FLV、MOV、TS、MPG | 负责把视频、音频、字幕等装在一起 |
| 视频编码 | 视频画面的压缩方式 | H.264、H.265、AV1、VP9 | 决定压缩效率、兼容性、画质 |
| 音频编码 | 声音数据的压缩方式 | AAC、MP3、Opus、PCM、MP2 | 决定音质、体积、兼容性 |
| 转码 | 把一种编码转换成另一种编码 | H.265 转 H.264 | 通常比较耗 CPU |
| 码率 | 每秒占用多少数据量 | 3000kbps、5Mbps | 影响清晰度、文件大小、带宽 |
| 帧率 | 每秒播放多少张画面 | 24fps、30fps、60fps | 影响流畅度 |
| 分辨率 | 画面宽高 | 1920x1080、1280x720 | 影响清晰度和体积 |
| 采样率 | 每秒采集多少次声音 | 44100Hz、48000Hz | 影响音频细节 |
| GOP | 一组视频帧 | I 帧到下一个 I 帧之前 | 影响拖动、秒开、切片 |
| 滤镜 | 对音视频做加工 | 缩放、裁剪、水印、字幕 | FFmpeg 常用能力 |
| 流选择 | 选择输入文件里的某些流 | 选择中文音轨、去掉字幕 | 常用 -map 参数 |
3. 封装格式:视频文件的"容器"
封装可以理解为:
视频文件的"外壳"或者"容器"。
常见封装格式:
text
MP4、AVI、MKV、FLV、MOV、TS、MPG
.mp4、.avi、.mkv 这些文件后缀,通常表示的就是封装格式。
封装格式负责把这些内容组织在一起:
- 视频流
- 音频流
- 字幕流
- 时间戳
- 封面
- 元数据
可以用快递箱来理解:
| 类比 | 音视频概念 |
|---|---|
| 快递箱 | MP4 / MKV / AVI |
| 衣服 | 视频流 |
| 鞋子 | 音频流 |
| 说明书 | 字幕流 |
| 快递单信息 | 元数据、时间戳 |
也就是说:
封装格式本身不等于视频画面,也不等于音频声音,它只是负责把各种数据装起来。
4. 常见容器格式总结
| 容器格式 | 常见后缀 | 特点 | 常见场景 |
|---|---|---|---|
| MP4 | .mp4 |
兼容性最好,网页和移动端支持广 | 普通上传、网页播放、移动端播放 |
| AVI | .avi |
较老,文件可能偏大,网络播放体验一般 | 老视频、旧系统 |
| MKV | .mkv |
支持多音轨、多字幕,功能强 | 高清电影、多字幕资源 |
| FLV | .flv |
早期直播和网页视频常见 | 旧直播平台、旧网页视频 |
| MOV | .mov |
Apple 体系常见 | iPhone、Final Cut、QuickTime |
| TS | .ts |
适合切片传输,容错能力较好 | HLS 直播、点播切片 |
| MPG / MPEG | .mpg、.mpeg |
较老的视频封装格式 | VCD、DVD、早期视频 |
视频平台常见选择
| 场景 | 推荐格式 |
|---|---|
| 用户上传后保存源文件 | 保留原始格式,或转成 MP4 |
| 普通网页播放 | MP4 + H.264 + AAC |
| 移动端播放 | MP4 + H.264 + AAC |
| 多清晰度在线播放 | HLS,也就是 m3u8 + ts |
| 直播 | HLS、FLV、WebRTC 等 |
| 高清电影文件 | MKV 比较常见 |
5. 编码格式:数据的压缩方式
编码可以理解为:
把原始音视频数据压缩成某种格式。
原始视频数据非常大。
假设一个视频每秒 30 张图片,每张图片都是高清图,如果完全不压缩,体积会非常恐怖。
所以需要编码压缩。
常见视频编码:
text
H.264、H.265、AV1、VP9、MPEG-1、MPEG-2
常见音频编码:
text
AAC、MP3、Opus、PCM、MP2
例如一个 MP4 文件里面可能是:
text
封装格式:MP4
视频编码:H.264
音频编码:AAC
也就是说:
| 部分 | 含义 |
|---|---|
| MP4 | 箱子 / 容器 |
| H.264 | 视频压缩方式 |
| AAC | 音频压缩方式 |
6. 常见视频编码总结
| 视频编码 | 特点 | 优点 | 缺点 | 常见场景 |
|---|---|---|---|---|
| H.264 / AVC | 目前最常见的视频编码 | 兼容性非常好 | 压缩效率不如 H.265、AV1 | 网页视频、短视频、直播、移动端 |
| H.265 / HEVC | H.264 的升级版 | 同等画质下体积更小 | 兼容性和授权问题更复杂 | 4K 视频、高清视频、部分移动端 |
| AV1 | 新一代开源编码 | 压缩率高,适合未来趋势 | 编码速度较慢,设备支持仍在普及 | 长视频平台、在线视频 |
| VP9 | Google 推动的视频编码 | 压缩效率较好,网页支持较多 | 生态不如 H.264 普遍 | YouTube、Web 视频 |
| MPEG-1 | 很早期的视频编码 | 老设备支持 | 压缩效率低,画质一般 | VCD、老视频 |
| MPEG-2 | 早期广播和 DVD 常见 | 稳定成熟 | 文件较大 | DVD、电视广播、老设备 |
新手建议
对于视频平台开发和普通网页播放来说,最常见组合是:
text
MP4 + H.264 + AAC
原因是:
- 浏览器支持好
- 移动端支持好
- 播放器兼容性好
- 转码和播放成本可控
7. 常见音频编码总结
| 音频编码 | 特点 | 优点 | 缺点 | 常见场景 |
|---|---|---|---|---|
| AAC | 视频领域常见音频编码 | 音质好,兼容性好 | 相比 MP3 稍复杂 | MP4、HLS、短视频、直播 |
| MP3 | 最经典的音频格式 | 兼容性极好 | 压缩效率不如 AAC、Opus | 音乐、老播放器 |
| Opus | 适合实时语音和网络传输 | 低延迟,低码率音质好 | 兼容性不如 MP3、AAC 普遍 | 语音通话、WebRTC |
| PCM | 未压缩音频 | 音质原始,处理简单 | 文件非常大 | 音频采集、音频处理、中间格式 |
| MP2 | 较老的音频编码 | 广播系统中常见 | 压缩效率一般 | 广播、老系统 |
视频平台常见音频选择
| 场景 | 常见选择 |
|---|---|
| MP4 文件播放 | AAC |
| HLS 播放 | AAC |
| 语音通话 | Opus |
| 音频原始处理 | PCM |
| 老音频文件 | MP3 |
8. 转码:把一种编码转换成另一种编码
转码就是:
把一种编码格式转换成另一种编码格式。
例如:
text
H.265 → H.264
MP3 → AAC
为什么需要转码?
因为不同设备、浏览器、播放器支持的格式不一样。
例如:
用户上传了一个 H.265 视频,但是某些浏览器不支持 H.265,平台就需要把它转成 H.264。
FFmpeg 转码命令示例:
bash
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
含义:
| 参数 | 含义 |
|---|---|
ffmpeg |
调用 FFmpeg 程序 |
-i input.mp4 |
输入文件是 input.mp4 |
-c:v libx264 |
视频编码转成 H.264 |
-c:a aac |
音频编码转成 AAC |
output.mp4 |
输出文件是 output.mp4 |
转码一般比较耗 CPU,因为它要经历:
text
解码 → 重新编码
所以:
转码不是简单复制文件,而是重新处理音视频数据。
9. 转封装和转码的区别
很多新手容易把"转码"和"改容器"混在一起。
转封装
转封装是:
编码不变,只是换一个容器。
例如:
bash
ffmpeg -i input.mkv -c copy output.mp4
含义:
| 参数 | 含义 |
|---|---|
-c copy |
音视频编码都不重新编码,直接复制流 |
output.mp4 |
换成 MP4 容器 |
特点:
- 速度很快
- CPU 消耗低
- 画质不变
- 但要求 MP4 容器支持原来的编码格式
转码
转码是:
重新解码,再重新编码。
例如:
bash
ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4
特点:
- 速度慢
- CPU 消耗高
- 可能有画质损失
- 兼容性更可控
对比总结
| 类型 | 是否重新编码 | 速度 | CPU 消耗 | 画质变化 | 常见参数 |
|---|---|---|---|---|---|
| 转封装 | 否 | 快 | 低 | 不变 | -c copy |
| 转码 | 是 | 慢 | 高 | 可能变化 | -c:v、-c:a |
10. 码率:每秒占用多少数据量
码率可以理解为:
每秒钟视频或音频占用多少数据量。
更准确地说:
码率 = 每秒钟要传输或者存储多少 bit 数据。
注意这里的单位通常是 bit ,不是 Byte。
11. bit、Byte、kbps、Mbps、MB/s 单位换算
| 单位 | 中文 | 说明 |
|---|---|---|
| bit | 比特 | 最小数据单位,用小写 b 表示 |
| Byte | 字节 | 常见文件大小单位,用大写 B 表示 |
| 1 Byte | 1 字节 | 等于 8 bit |
| kbps | kilobits per second | 每秒多少千比特 |
| Mbps | megabits per second | 每秒多少兆比特 |
| KB/s | kilobytes per second | 每秒多少千字节 |
| MB/s | megabytes per second | 每秒多少兆字节 |
核心换算关系
| 换算 | 结果 |
|---|---|
| 1 Byte | 8 bit |
| 1 KB | 1024 Byte |
| 1 MB | 1024 KB |
| 1 Mbps | 1000 kbps |
| 8 Mbps | 约等于 1 MB/s |
| 1 Mbps | 约等于 0.125 MB/s |
注意:网络码率常用
Mbps,文件大小常用MB。小写
b是 bit,大写B是 Byte,二者差 8 倍。
常见换算示例
| 码率 | 换算成 MB/s | 含义 |
|---|---|---|
| 1000kbps | 约 0.125MB/s | 每秒约 0.125MB |
| 3000kbps | 约 0.375MB/s | 每秒约 0.375MB |
| 5Mbps | 约 0.625MB/s | 每秒约 0.625MB |
| 8Mbps | 约 1MB/s | 每秒约 1MB |
| 20Mbps | 约 2.5MB/s | 每秒约 2.5MB |
12. 文件大小如何计算
核心公式:
text
文件大小 = 码率 × 时长
但是要注意单位换算:
text
bit → Byte 需要除以 8
示例 1:视频码率 3000kbps,时长 10 分钟
text
3000kbps = 3Mbps
10 分钟 = 600 秒
3Mbps × 600 秒 = 1800Mb
1800Mb ÷ 8 = 225MB
所以大约是:
text
225MB
示例 2:音频码率 128kbps,时长 10 分钟
text
128kbps × 600 秒 = 76800kb
76800kb ÷ 8 = 9600KB
9600KB ÷ 1024 ≈ 9.4MB
所以大约是:
text
9.4MB
常见音频码率大小估算
| 音频码率 | 1 分钟大小 | 10 分钟大小 | 说明 |
|---|---|---|---|
| 64kbps | 约 0.48MB | 约 4.8MB | 语音可以接受 |
| 128kbps | 约 0.96MB | 约 9.6MB | 普通音乐常见 |
| 192kbps | 约 1.44MB | 约 14.4MB | 音质更好 |
| 320kbps | 约 2.4MB | 约 24MB | 高码率音乐 |
常见视频码率大小估算
| 视频码率 | 1 分钟大小 | 10 分钟大小 | 说明 |
|---|---|---|---|
| 800kbps | 约 6MB | 约 60MB | 低清视频 |
| 1500kbps | 约 11.25MB | 约 112.5MB | 480p / 720p 低码率 |
| 3000kbps | 约 22.5MB | 约 225MB | 720p / 1080p 常见 |
| 5000kbps | 约 37.5MB | 约 375MB | 1080p 较清晰 |
| 8000kbps | 约 60MB | 约 600MB | 高码率 1080p |
13. 码率对画质、文件大小、带宽的影响
码率越高,通常:
- 画质越好
- 文件越大
- 占用带宽越高
- 播放越容易卡
- 存储成本越高
码率越低,通常:
- 文件更小
- 更省带宽
- 播放更流畅
- 但画面可能变糊
同样是 1080p 视频:
| 码率 | 可能效果 |
|---|---|
| 800kbps | 很可能比较糊 |
| 3000kbps | 比较清晰 |
| 8000kbps | 更清晰,但文件大、带宽高 |
FFmpeg 设置视频码率:
bash
ffmpeg -i input.mp4 -b:v 1000k output.mp4
含义:
text
把视频码率设置为大约 1000kbps
FFmpeg 设置音频码率:
bash
ffmpeg -i input.mp4 -b:a 128k output.mp4
含义:
text
把音频码率设置为大约 128kbps
14. 帧率:一秒播放多少张画面
帧率就是:
一秒钟播放多少张画面。
单位是:
text
fps
fps = frames per second,意思是每秒帧数。
常见帧率:
| 帧率 | 常见场景 |
|---|---|
| 24fps | 电影 |
| 25fps | 电视、部分地区视频制式 |
| 30fps | 普通视频、短视频 |
| 60fps | 游戏录屏、运动视频、高流畅视频 |
可以把视频理解成动画片:
text
1 秒播放 30 张图片,就是 30fps
1 秒播放 60 张图片,就是 60fps
帧率越高:
- 画面越流畅
- 数据量可能越大
- 对设备性能要求更高
FFmpeg 设置帧率:
bash
ffmpeg -i input.mp4 -r 30 output.mp4
含义:
text
输出视频帧率设置为 30fps
15. 分辨率:视频画面的宽和高
分辨率就是:
视频画面的宽和高。
例如:
text
1920x1080
1280x720
854x480
3840x2160
1920x1080 的意思是:
text
宽 1920 个像素,高 1080 个像素
常见分辨率:
| 名称 | 常见分辨率 | 说明 |
|---|---|---|
| 360p | 640x360 | 低清 |
| 480p | 854x480 | 标清 |
| 720p | 1280x720 | 高清 |
| 1080p | 1920x1080 | 全高清 |
| 2K | 2560x1440 | 更高清 |
| 4K | 3840x2160 | 超高清 |
分辨率越高:
- 画面越清晰
- 文件可能越大
- 转码更耗 CPU
- 播放更吃带宽
FFmpeg 设置分辨率:
bash
ffmpeg -i input.mp4 -s 1280x720 output.mp4
更常见的是使用滤镜:
bash
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
在视频平台里,经常会把一个原视频转成多个清晰度:
text
1080p
720p
480p
360p
这样用户网络好就看高清,网络差就看低清。
16. 音频采样率:每秒采集多少次声音
音频采样率可以理解为:
每秒钟采集多少次声音。
常见采样率:
| 采样率 | 常见场景 |
|---|---|
| 8000Hz | 电话语音 |
| 16000Hz | 语音识别 |
| 44100Hz | 音乐、普通音频 |
| 48000Hz | 视频、影视制作 |
例如:
text
44100Hz = 每秒采集 44100 次声音
可以这样理解:
| 类型 | 类比 |
|---|---|
| 视频 | 每秒拍很多张图片 |
| 音频 | 每秒采集很多次声音 |
采样率越高:
- 声音细节越多
- 音质可能越好
- 文件可能越大
FFmpeg 设置音频采样率:
bash
ffmpeg -i input.mp4 -ar 44100 output.mp4
设置音频编码、码率、采样率、声道数:
bash
ffmpeg -i input.mp4 -c:a aac -b:a 128k -ar 44100 -ac 2 output.mp4
含义:
| 参数 | 含义 |
|---|---|
-c:a aac |
音频编码为 AAC |
-b:a 128k |
音频码率为 128kbps |
-ar 44100 |
音频采样率为 44100Hz |
-ac 2 |
声道数为 2,也就是双声道 |
17. GOP:一组视频帧
GOP 这个词对新手有点抽象,可以先这样理解:
GOP 是一组视频帧,从一个关键帧开始,到下一个关键帧之前结束。
要理解 GOP,先知道视频帧大概有几种:
| 帧类型 | 名称 | 特点 |
|---|---|---|
| I 帧 | 关键帧 | 可以独立解码,像一张完整图片 |
| P 帧 | 前向预测帧 | 参考前面的帧 |
| B 帧 | 双向预测帧 | 参考前后帧 |
最重要的是 I 帧。
I 帧可以独立解码,可以理解成一张完整图片。
P 帧、B 帧不是完整图片,它们依赖别的帧。
例如:
text
I B B P B B P B B I
从第一个 I 帧到下一个 I 帧之前,就是一个 GOP。
GOP 为什么重要?
因为视频拖动进度条、切片、秒开都和关键帧有关。
例如你拖到第 10 秒:
- 如果第 10 秒附近有关键帧,播放器很快能播放
- 如果关键帧离得很远,播放器可能要往前找关键帧再解码
GOP 大小对比
| GOP 设置 | 优点 | 缺点 |
|---|---|---|
| GOP 较大 | 压缩率高,文件可能更小 | 拖动可能慢,HLS 切片不方便 |
| GOP 较小 | 拖动更灵敏,切片更方便 | 文件可能变大 |
FFmpeg 设置 GOP:
bash
ffmpeg -i input.mp4 -g 60 output.mp4
如果是 30fps,-g 60 大概表示:
text
每 60 帧一个关键帧
也就是大约 2 秒一个关键帧
18. 滤镜:对音视频做加工处理
滤镜可以理解为:
对音视频做加工处理。
就像图片软件里的滤镜一样,FFmpeg 的滤镜可以处理视频画面和声音。
常见视频滤镜:
| 滤镜 | 作用 |
|---|---|
scale |
缩放 |
crop |
裁剪 |
pad |
补边 |
overlay |
加水印 |
rotate |
旋转 |
fps |
改帧率 |
subtitles |
加字幕 |
缩放:
bash
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
含义:
text
把视频画面缩放到 1280x720
裁剪:
bash
ffmpeg -i input.mp4 -vf crop=1280:720:0:0 output.mp4
含义:
text
从画面中裁剪出 1280x720 的区域
加水印:
bash
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=10:10 output.mp4
含义:
text
把 logo.png 叠加到视频左上角附近
常见参数:
| 参数 | 含义 |
|---|---|
-vf |
video filter,视频滤镜 |
-af |
audio filter,音频滤镜 |
-filter_complex |
复杂滤镜,适合多输入、多滤镜组合 |
在视频平台里,滤镜常用于:
- 生成不同分辨率
- 加水印
- 裁剪黑边
- 旋转视频
- 加字幕
- 调整音量
19. 流选择:选择文件里的视频流、音频流、字幕流
流选择就是:
一个媒体文件里面可能有多个视频流、音频流、字幕流,你要选择哪些输出。
一个视频文件不一定只有一路视频和一路音频。
比如一个电影文件可能是:
| 流 | 内容 |
|---|---|
| 视频流 0 | 电影画面 |
| 音频流 1 | 中文音轨 |
| 音频流 2 | 英文音轨 |
| 字幕流 3 | 中文字幕 |
| 字幕流 4 | 英文字幕 |
如果你直接转码,FFmpeg 可能默认只选一部分。
如果你想明确指定,就要用 -map。
示例:
bash
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:0 output.mp4
含义:
text
从第 0 个输入文件中
选择第 1 路视频流
选择第 1 路音频流
输出到 output.mp4
解释:
| 写法 | 含义 |
|---|---|
0:v:0 |
第 0 个输入文件的第 0 路视频流 |
0:a:0 |
第 0 个输入文件的第 0 路音频流 |
0:a:1 |
第 0 个输入文件的第 1 路音频流 |
如果有多个音轨:
text
0:a:0 中文
0:a:1 英文
想选英文音轨:
bash
ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 output.mp4
在视频平台里,流选择用于:
- 选择指定音轨
- 去掉字幕
- 保留字幕
- 去掉音频
- 只提取音频
- 多输入合成
20. HLS、m3u8、ts 是什么
在视频平台里,经常会遇到:
text
HLS
m3u8
ts
它们一般一起出现。
HLS
HLS 全称是:
text
HTTP Live Streaming
可以理解为:
一种基于 HTTP 的流媒体播放方案。
它的核心思想是:
不直接播放一个完整的大视频文件,而是把视频切成很多小片段,然后边下边播。
m3u8
.m3u8 是播放列表文件。
它本身通常不是视频内容,而是一个文本文件,里面记录了:
- 有哪些 ts 切片
- 每个切片多长
- 播放顺序是什么
- 是否有多清晰度版本
可以理解为:
m3u8 是目录,告诉播放器应该按什么顺序播放哪些视频切片。
ts
.ts 是真正的视频切片文件。
例如:
text
index.m3u8
segment_000.ts
segment_001.ts
segment_002.ts
segment_003.ts
播放器先请求 index.m3u8,再根据里面的内容依次请求 .ts 文件。
HLS 结构示例
text
hls_output/
├── index.m3u8
├── segment_000.ts
├── segment_001.ts
├── segment_002.ts
└── segment_003.ts
HLS、m3u8、ts 总结
| 名称 | 类型 | 作用 |
|---|---|---|
| HLS | 流媒体协议 / 播放方案 | 把视频切片后通过 HTTP 播放 |
| m3u8 | 播放列表文件 | 记录 ts 切片地址和播放顺序 |
| ts | 视频切片文件 | 真正存放音视频数据 |
FFmpeg 生成 HLS 示例:
bash
ffmpeg -i input.mp4 \
-c:v libx264 \
-c:a aac \
-hls_time 5 \
-hls_list_size 0 \
-f hls output.m3u8
参数解释:
| 参数 | 含义 |
|---|---|
-hls_time 5 |
每个 ts 切片大约 5 秒 |
-hls_list_size 0 |
m3u8 保留所有切片记录 |
-f hls |
输出格式为 HLS |
output.m3u8 |
输出播放列表文件 |
21. FFmpeg 常用命令总结
| 需求 | 命令 |
|---|---|
| 查看媒体信息 | ffmpeg -i input.mp4 |
| 转成 H.264 + AAC | ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4 |
| 只转封装,不重新编码 | ffmpeg -i input.mkv -c copy output.mp4 |
| 设置视频码率 | ffmpeg -i input.mp4 -b:v 1000k output.mp4 |
| 设置音频码率 | ffmpeg -i input.mp4 -b:a 128k output.mp4 |
| 设置帧率 | ffmpeg -i input.mp4 -r 30 output.mp4 |
| 设置分辨率 | ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4 |
| 设置音频采样率 | ffmpeg -i input.mp4 -ar 44100 output.mp4 |
| 设置 GOP | ffmpeg -i input.mp4 -g 60 output.mp4 |
| 去掉音频 | ffmpeg -i input.mp4 -an output.mp4 |
| 只提取音频 | ffmpeg -i input.mp4 -vn output.aac |
| 选择指定音轨 | ffmpeg -i input.mkv -map 0:v:0 -map 0:a:1 output.mp4 |
| 生成 HLS | ffmpeg -i input.mp4 -c:v libx264 -c:a aac -hls_time 5 -hls_list_size 0 -f hls output.m3u8 |
22. 视频平台里的常见处理流程
一个简单的视频平台,用户上传视频后,后端可能会这样处理:
text
用户上传视频
↓
保存源文件
↓
用 FFmpeg 分析文件信息
↓
判断编码、分辨率、码率、时长
↓
转码成平台统一格式
↓
生成多清晰度版本
↓
生成 HLS 切片
↓
前端播放器加载 m3u8 播放
常见输出格式:
| 清晰度 | 分辨率 | 参考码率 |
|---|---|---|
| 360p | 640x360 | 500kbps ~ 800kbps |
| 480p | 854x480 | 800kbps ~ 1500kbps |
| 720p | 1280x720 | 1500kbps ~ 3000kbps |
| 1080p | 1920x1080 | 3000kbps ~ 6000kbps |
| 4K | 3840x2160 | 12000kbps 以上 |
具体码率不是固定值,要根据画面复杂度、编码格式、平台成本、目标用户网络情况调整。
23. 最重要的区别总结
容器和编码的区别
| 对比项 | 容器 / 封装格式 | 编码格式 |
|---|---|---|
| 作用 | 把视频、音频、字幕等装起来 | 压缩视频或音频数据 |
| 常见例子 | MP4、MKV、AVI、TS | H.264、H.265、AAC、MP3 |
| 类比 | 快递箱 | 箱子里的物品压缩方式 |
| 是否决定画质 | 不直接决定 | 很大程度影响 |
| 是否影响兼容性 | 会影响 | 也会影响 |
视频参数之间的关系
| 参数 | 主要影响 |
|---|---|
| 分辨率 | 清晰度、文件大小、转码压力 |
| 帧率 | 流畅度、文件大小 |
| 码率 | 画质、文件大小、带宽 |
| 编码格式 | 压缩效率、兼容性 |
| GOP | 拖动体验、秒开、切片效果 |
| 容器格式 | 播放器兼容性、是否适合流式播放 |
24. 新手学习路线建议
如果你是为了学习 FFmpeg 或视频平台开发,可以按这个顺序学:
- 先理解容器、编码、转码
- 再理解码率、帧率、分辨率
- 再理解音频采样率、声道、音频码率
- 再理解 GOP、关键帧
- 再学习 FFmpeg 常用命令
- 再学习 HLS、m3u8、ts
- 最后结合项目做上传、转码、切片、播放链路
对新手来说,不需要一开始就研究特别深的算法原理。
先能看懂这些命令就够了:
bash
ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
ffmpeg -i input.mp4 -b:v 1000k -b:a 128k output.mp4
ffmpeg -i input.mp4 -hls_time 5 -hls_list_size 0 -f hls output.m3u8
25. 一句话总结
音视频文件可以这样理解:
text
容器格式:负责装东西
视频编码:负责压缩画面
音频编码:负责压缩声音
码率:决定每秒数据量
帧率:决定每秒多少张画面
分辨率:决定画面大小
采样率:决定每秒采集多少次声音
GOP:决定关键帧间隔
HLS:把视频切片后在线播放
FFmpeg:负责分析、转码、切片、处理音视频
最常见的网页视频组合是:
text
MP4 + H.264 + AAC
最常见的在线播放切片方案是:
text
HLS = m3u8 + ts