Video Decoding
概述
视频解码将接收到的压缩视频数据还原为原始视频帧数据。
解码器类型
软件解码器
FFmpeg/libavcodec
关系说明:
– FFmpeg 是一个完整的音视频处理框架,包含多个组件
– libavcodec 是 FFmpeg 项目中的核心编解码库组件
– FFmpeg 使用 libavcodec 进行编解码操作
– 因此 “FFmpeg/libavcodec” 表示 FFmpeg 框架中的解码功能(通过 libavcodec 实现)
特点:
– 支持几乎所有主流编码格式(H.264、H.265、VP8、VP9、AV1等)
– 纯软件解码,兼容性最好
– 跨平台支持(Windows、macOS、Linux、Android、iOS等)
– 开源免费,广泛使用
– 解码质量高,功能完整
优势:
– 格式支持最全面
– 代码成熟稳定
– 社区活跃,持续更新
劣势:
– CPU 占用较高(相比硬件解码)
– 解码速度相对较慢(纯软件实现)
适用场景:
– 通用视频播放器
– 视频转码和处理工具
– 跨平台应用开发
– 需要支持多种格式的场景
libvpx
类型:VP8/VP9 编解码库(Google 开源)
特点:
– 专门用于 VP8 和 VP9 格式的编解码
– 支持 VP8/VP9 的软件编解码
– 开源免费,无专利限制
– 解码质量好,性能优化
优势:
– VP8/VP9 格式的官方参考实现
– 无专利风险
– 适合 Web 应用(WebM 格式)
劣势:
– 仅支持 VP8/VP9 格式
– 使用场景相对有限
适用场景:
– WebM 视频播放
– WebRTC 视频通话
– 需要 VP8/VP9 解码的应用
硬件解码器
硬件加速解码:利用GPU或专用硬件进行解码
平台支持:
– Windows: DXVA2、D3D11 Video
– macOS/iOS: VideoToolbox
– Android: MediaCodec
– Linux: VDPAU、VAAPI
特点:
– CPU 占用极低
– 解码速度极快
– 需要硬件支持,兼容性中等
– 通常支持 H.264/H.265 格式
适用场景:
– 高性能视频播放
– 低功耗需求场景
– 移动设备视频解码
解码器对比
| 解码器 | 支持格式 | 类型 | CPU占用 | 解码速度 | 兼容性 | 主要用途 |
|---|---|---|---|---|---|---|
| libavcodec | H.264、H.265、VP8、VP9、AV1等几乎所有格式 | 软件 | 高 | 中等 | 最好 | 通用视频解码 |
| libvpx | VP8、VP9 | 软件 | 中等 | 快 | 良好 | VP8/VP9专用解码 |
| 硬件解码器 | 取决于硬件(通常支持H.264/H.265) | 硬件加速 | 极低 | 极快 | 中等(需硬件支持) | 高性能解码 |
FFmpeg 组件关系
FFmpeg 项目包含以下主要组件:
– libavcodec:编解码库(包含各种格式的编解码器)
– libavformat:容器格式处理库(MP4、FLV、MKV等)
– libavfilter:音视频滤镜库
– libavutil:工具库
– libswscale:图像缩放和格式转换库
– libswresample:音频重采样库
使用建议
- 通用解码:优先使用 FFmpeg/libavcodec,格式支持最全面
- VP8/VP9 专用:可以使用 libvpx,针对性强
- 高性能需求:优先使用硬件解码器(如果硬件支持)
- 跨平台开发:推荐使用 FFmpeg,兼容性最好
解码流程
码流解析
- 解析容器格式(MP4、FLV、MKV等)
- 提取编码参数(分辨率、帧率、GOP结构等)
- 解析NAL单元(H.264/H.265)或帧数据
SPS 和 PPS
SPS (Sequence Parameter Set) – 序列参数集:
– 包含视频序列的全局参数信息
– 主要参数包括:
– 视频分辨率(宽度、高度)
– 帧率信息
– 编码档次(Profile)和级别(Level)
– 色度格式和位深
– GOP 结构相关参数
– 在解码器初始化时必须先获取 SPS,用于配置解码器参数
– 通常出现在码流开始位置,或关键帧(I帧)之前
PPS (Picture Parameter Set) – 图像参数集:
– 包含单个图像或图像序列的编码参数
– 主要参数包括:
– 熵编码模式(CABAC/CAVLC)
– 量化参数相关设置
– 去块滤波参数
– 参考帧数量
– 每个图像可以引用不同的 PPS
– 解码每个图像前需要先获取对应的 PPS
关系与作用:
– SPS 和 PPS 是 H.264/H.265 编码标准中的参数集
– 解码器必须先解析 SPS 和 PPS 才能正确解码后续的视频帧
– 在实时流传输中,SPS 和 PPS 通常需要单独传输或嵌入在关键帧中
– 如果 SPS/PPS 丢失,解码器无法正确解码视频帧
帧重建
- I帧解码:直接重建
- P帧解码:参考前一帧进行运动补偿
- B帧解码:参考前后两帧进行双向预测
错误恢复
- 检测丢包或错误帧
- 使用错误隐藏技术(复制前一帧、插值等)
- 请求关键帧重传
解码优化
多线程解码
- 帧级并行:多帧同时解码
- 片级并行:单帧分片并行解码
- 注意线程同步和内存管理
硬件加速
- 使用GPU或专用硬件解码,大幅降低CPU占用
- 注意硬件兼容性和格式支持
低延迟解码
- 减少缓冲帧数
- 优先解码关键帧
- 快速启动解码器
