目录
[🧩 一、编码 / 解码 是什么?](#🧩 一、编码 / 解码 是什么?)
[🎞️ 二、解复用和解码的关系](#🎞️ 二、解复用和解码的关系)
[🎨 三、YUV、PCM、H.264、AAC 是什么?](#🎨 三、YUV、PCM、H.264、AAC 是什么?)
[🧠 四、为什么解码输出 YUV / PCM?](#🧠 四、为什么解码输出 YUV / PCM?)
[💡 五、为什么渲染要转成 RGB 和 Qt 播放?](#💡 五、为什么渲染要转成 RGB 和 Qt 播放?)
[⏱️ 六、同步(Audio-Video Sync)](#⏱️ 六、同步(Audio-Video Sync))
[✅ 七、最简总结](#✅ 七、最简总结)
🧩 一、编码 / 解码 是什么?
| 名称 | 意思 | 举例 | 
|---|---|---|
| 编码(Encode) | 把原始数据压缩成体积小的格式 | 原始视频 → H.264,原始音频 → AAC | 
| 解码(Decode) | 把压缩格式还原成原始数据 | H.264 → 原始图像(YUV),AAC → 原始声音(PCM) | 
👉 在播放器 里,只做"解码 ",因为你是播放别人编码好的视频 。
编码一般在"录制 / 推流 / 转码"时才用。
🎞️ 二、解复用和解码的关系
文件 → 解复用(Demux) → 解码(Decode) → 原始帧
| 步骤 | 输入 | 输出 | 举例 | 
|---|---|---|---|
| 解复用 | .mp4 文件 | AVPacket(压缩数据) | 一包 H.264 或 AAC | 
| 解码 | AVPacket | AVFrame(原始帧) | 一帧 YUV 图像 或 PCM 音频 | 
✅ 所以,AVPacket 只是中间的压缩包,最终要交给解码器转换成 AVFrame 才能播放。
🎨 三、YUV、PCM、H.264、AAC 是什么?
| 名称 | 类型 | 用途 | 是否压缩 | 举例 | 
|---|---|---|---|---|
| H.264 | 视频压缩编码格式 | 存储或传输视频 | ✅ 有压缩 | .mp4、.flv 文件里的视频流 | 
| AAC | 音频压缩编码格式 | 存储或传输音频 | ✅ 有压缩 | .mp4 文件里的音频流 | 
| YUV | 原始视频帧格式 | 显示前的图像 | ❌ 无压缩 | 解码后的视频数据 | 
| PCM | 原始音频格式 | 播放前的声音 | ❌ 无压缩 | 解码后的音频数据 | 
🧠 四、为什么解码输出 YUV / PCM?
因为:
- 
H.264、AAC 是压缩格式,不能直接显示/播放;
 - 
只有解码后得到的:
- 
视频帧 → YUV:每一帧像素数据;
 - 
音频帧 → PCM:每个采样点的数据;
 
 - 
 
播放器用的就是这些原始数据。
💡 五、为什么渲染要转成 RGB 和 Qt 播放?
- 
屏幕显示的颜色模式是 RGB ,
而视频解码出来是 YUV ,所以要用
sws_scale()把 YUV → RGB; - 
音频输出设备(声卡)支持 PCM(采样信号) ,
所以
QAudioOutput直接播放 PCM。 
🎬 视频流程:H.264 →(解码)→ YUV →(颜色转换)→ RGB → 屏幕显示
🎧 音频流程:AAC →(解码)→ PCM → 声卡播放
⏱️ 六、同步(Audio-Video Sync)
对!你理解得对:
同步就是让解码得到的视频和音频对齐播放。
思路:
- 
每帧音频、视频都有一个显示时间戳(PTS);
 - 
播放时比较音频PTS和视频PTS:
- 
如果视频太快 → 等一会再显示;
 - 
如果视频太慢 → 丢掉几帧追上音频;
 
 - 
 - 
一般以音频为主时钟(因为耳朵比眼睛更敏感)。
 
✅ 七、最简总结
| 流程 | 输入 | 输出 | 数据格式 | 
|---|---|---|---|
| 解复用 | MP4文件 | 压缩包 AVPacket | 
H.264 / AAC | 
| 解码 | AVPacket | 原始帧 AVFrame | 
YUV / PCM | 
| 同步 | 比对PTS | 保证音画一致 | 时间对齐 | 
| 渲染 | YUV→RGB / PCM→播放 | 屏幕 / 声卡输出 | RGB / PCM |