文章目录
-
- [📦 1. **容器(Container)**](#📦 1. 容器(Container))
-
- [✅ 定义:](#✅ 定义:)
- [✅ 举例:](#✅ 举例:)
- [✅ 功能:](#✅ 功能:)
- [📶 2. **媒体流(Stream)**](#📶 2. 媒体流(Stream))
-
- [✅ 定义:](#✅ 定义:)
- [✅ 举例:](#✅ 举例:)
- [✅ 流和容器关系:](#✅ 流和容器关系:)
- [🧱 3. **数据帧(Frame / Packet)**](#🧱 3. 数据帧(Frame / Packet))
-
- [✅ 定义:](#✅ 定义:)
- [✅ 举例:](#✅ 举例:)
- [🎞️ 4. **编解码器(Codec)**](#🎞️ 4. 编解码器(Codec))
-
- [✅ 定义:](#✅ 定义:)
- [✅ 功能:](#✅ 功能:)
- [✅ 举例:](#✅ 举例:)
- [✅ 说明:](#✅ 说明:)
- [🔄 5. **复用器(Muxer)**](#🔄 5. 复用器(Muxer))
-
- [✅ 定义:](#✅ 定义:)
- [✅ 举例:](#✅ 举例:)
- [🔍 6. **解复用器(Demuxer)**](#🔍 6. 解复用器(Demuxer))
-
- [✅ 定义:](#✅ 定义:)
- [✅ 举例:](#✅ 举例:)
- [🧠 它们的关系图(理解路径):](#🧠 它们的关系图(理解路径):)
- [💬 举个生活类比:](#💬 举个生活类比:)
这是音视频领域中非常核心的一些基础概念,它们是构建媒体播放、推流、编解码、直播系统等的基础。下面我给你分条清晰地讲一下这些术语之间的含义和联系:
📦 1. 容器(Container)
✅ 定义:
容器是一种媒体封装格式 ,用来将音频流、视频流、字幕流等打包在一个文件中。
✅ 举例:
- 常见的容器格式有:
.mp4
、.mkv
、.avi
、.mov
、.flv
、.ts
等
- 容器 ≠ 编码方式,它只是"装"编码后的数据的一个壳子。
✅ 功能:
- 封装多个媒体流(视频、音频、字幕)
- 提供时序信息(比如音视频同步)
- 支持索引、元数据等
📶 2. 媒体流(Stream)
✅ 定义:
媒体流是指某一类连续的媒体数据,通常是视频流、音频流或字幕流。
✅ 举例:
- 一个
.mp4
文件中可能有:- 一条视频流(例如 H.264 编码)
- 一条音频流(例如 AAC 编码)
- 一条字幕流(例如 SRT)
✅ 流和容器关系:
- 容器中可以有多条流(Stream),每条流是独立的数据序列。
- 解码和播放的时候,需要对每条流单独处理。
🧱 3. 数据帧(Frame / Packet)
✅ 定义:
- Frame (帧):解码后的数据单位(未压缩)
- 视频帧是一张图片
- 音频帧是一段 PCM 采样点
- Packet(包):压缩后的数据单位(经过编码器压缩后,准备写入容器的)
✅ 举例:
- 视频:
- 解码前:H.264 压缩包(packet)
- 解码后:YUV 图像(frame)
- 音频:
- 解码前:AAC 压缩包(packet)
- 解码后:PCM 数据(frame)
🚨 注意:
frame
通常指未压缩的图像/音频数据,而packet
是压缩后的小块数据。
🎞️ 4. 编解码器(Codec)
✅ 定义:
Codec = COder + DECoder,即"编码器/解码器"。
✅ 功能:
- 编码器:将原始媒体数据压缩成占用更少空间的数据
- 解码器:将压缩数据还原成可播放的原始数据
✅ 举例:
媒体类型 | 编码器 | 解码器 |
---|---|---|
视频 | H.264、H.265、VP9、AV1 | 对应解码器 |
音频 | AAC、MP3、FLAC、Opus | 对应解码器 |
✅ 说明:
- 媒体播放器(如 VLC)必须支持容器格式和其内部使用的编解码器,才能正常播放。
🔄 5. 复用器(Muxer)
✅ 定义:
复用器(Muxer)把多条媒体流(音频、视频)打包进容器,形成一个完整的媒体文件或媒体流。
✅ 举例:
-
把 H.264 视频、AAC 音频合成一个
.mp4
文件,就需要复用器。 -
ffmpeg
就是常用的复用工具:bashffmpeg -i video.h264 -i audio.aac -c copy output.mp4
🔍 6. 解复用器(Demuxer)
✅ 定义:
解复用器(Demuxer)从容器中提取出音视频流,再送到对应的解码器中处理。
✅ 举例:
- 播放器播放一个
.mp4
文件,首先通过解复用器提取音频流和视频流:- 音频流送到 AAC 解码器
- 视频流送到 H.264 解码器
🧠 它们的关系图(理解路径):
[摄像头/麦克风采集原始数据]
↓
[原始帧]
↓ 编码器(Codec)
[压缩帧]
↓ 复用器(Muxer)
[封装到容器 - MP4文件]
↓
-----------------------------
↓
播放阶段:
↓ 解复用器(Demuxer)
[音视频流分离]
↓ 解码器(Codec)
[原始帧]
↓ 渲染
[画面 + 声音 输出]
💬 举个生活类比:
- 容器:像打包好的快递盒(比如顺丰箱子)
- 流:快递盒里放的东西(音频、视频、字幕)
- Packet:每个流中的一小块数据,像一个个文件袋
- Codec:像压缩和解压缩的算法,压缩快递体积
- Muxer:像打包员,把所有内容封装进盒子
- Demuxer:像拆包员,把盒子打开、分拣内容