音视频播放的核心处理流程 - 详解

目录

一、编码 / 解码 是什么?

️ 二、解复用和解码的关系

什么?就是 三、YUV、PCM、H.264、AAC

四、为什么解码输出 YUV / PCM?

五、为什么渲染要转成 RGB 和 Qt 播放?

⏱️ 六、同步(Audio-Video Sync)

✅ 七、最简总结


一、编码 / 解码 是什么?

名称意思举例
编码(Encode)把原始数据压缩成体积小的格式原始视频 → H.264,原始音频 → AAC
解码(Decode)把压缩格式还原成原始数据H.264 → 原始图像(YUV),AAC → 原始声音(PCM)

播放器里,只做“解码”,因为你是播放别人编码好的视频
编码一般在“录制 / 推流 / 转码”时才用。


️ 二、解复用和解码的关系

档案 → 解复用(Demux) → 解码(Decode) → 原始帧

步骤输入输出举例
解复用.mp4 文件AVPacket(压缩信息)一包 H.264 或 AAC
解码AVPacketAVFrame(原始帧)一帧 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文件压缩包 AVPacketH.264 / AAC
解码AVPacket原始帧 AVFrameYUV / PCM
同步比对PTS保证音画一致时间对齐
渲染YUV→RGB / PCM→播放屏幕 / 声卡输出RGB / PCM

posted @ 2025-12-03 10:41  yangykaifa  阅读(11)  评论(0)    收藏  举报