音视频基础知识
1、音视频处理流程
音视频编辑
- 第一步:输入的 容器文件 经过 解复用器(demuxer) 被拆分成编码格式的音频流和视频流 等(包队列)
- 第二步:每个流经过对应的 解码器(decoder) 进行解压处理
- 视频流(H.264等编码) 被还原成 像素数据(RGB/YUV)
- 音频流(AAC等编码) 被还原成 样本数据(PCM)
- 第三步:像素和样本数据经过对应的 过滤器(filters) 处理,如改分辨率、裁剪、改音量等
- 第四步:像素和样本数据经过对应的 编码器(encoder) 压缩成 不同的编码格式
- 第五步:编码格式的视频流和音频流经过 复用器(muxer) 被封装到需要的新的容器格式文件中
音视频播放
- 第一步:视频文件通过 解复用 + 解码 放入 采样帧队列 和 图像帧队列
- 第二步:时钟同步
- Audio Master:视频跟着音频(最常见)
- Video Master:音频跟着视频
- External Clock Master:同步音频和视频到外部时钟
- 第三步: 通过硬件播放出来
录屏
- 第一步:从硬件采集原始音频数据和视频数据,时钟同步
- 第二步:进行 音视频降噪、格式转换 等处理后放入 采样帧队列 和 图像帧队列
- 第三步:编码 + 复用
2、图像格式四要素
位深
- 8bit:最常见,一个像素在每个通道的值范围是 0~255
- 10bit:特殊,一个像素在每个通道的值范围是 0~1023
色彩空间
- RGB:描述一个像素颜色的三种基色,R红,G绿,B蓝
- Python Pillow 库的默认色彩空间为 RGB
- C++ opencv2 库的默认色彩空间为 BGR
- 还可以加上一个透明度通道,RGBA
- YUV:描述一个像素颜色的亮度与色度的三个分量,Y亮度、U/Cb蓝色差,V/Cr红色差
- 每个像素必须有 Y 分量,UV 可减少,用于降低存储
- 444 采样:1Y ----1UV,每一行的 1 个 Y 对应 1 对 UV,平均每个像素 3B
- 422 采样:2Y----1UV,每一行的 2 个 Y 对应 1 对 UV,平均每个像素 2B
- 420 采样:4Y----1UV,每两行的 2x2 的 4 个 Y 对应 1 对 UV,平均每个像素 1.5B
存储方式
- packed 打包格式:逐像素打包所有通道,多维数组
(H,W,C)高度x宽度x通道- RGB888格式:RGBRGB......RGBRGB
- planar 平面格式:按通道拆分存储,多维数组
(C,H,W)通道x高度x宽度- YUV420P格式:YY......YYUU......UUVV......VV,420采样
- semi-planar 半平面格式:亮度通道平面,色度通道打包,多维数组
(C,H,W)通道x高度x宽度- NV21格式:YY......YYVUVU......VUVU,420采样
- NV12格式:YY......YYUVUV......UVUV,420采样
跨度
- 跨度 stride:内存中跳多少字节能找到 下一通道/下一列/下一行
- 内存对齐:为了硬件访问效率,图像的行尾会填充的额外字节,要算进 stride 中
3、PCM 音频
- PCM 脉冲编码调制:将模拟信号(连续时间)转换为数字信号(离散时间)的技术
- PCM 五要素:位深、采样率、声道数、存储方式、跨度
- 每帧的持续时间(秒) = 每帧采样点数 / 采样频率(Hz)
- packed 打包格式:左右声道的样本交替存储, L1 R1 L2 R2 L3 R3 L4 R4
- planar 平面格式:左右声道的样本分别连续存储,L1 L2 L3 L4 ......R1 R2 R3 R4
4、视频帧概念
-
I 帧(关键帧):只有帧内压缩,不考虑运动矢量,是 P 帧和 B 帧的参考帧。
-
P 帧(前向预测帧):记录本帧跟之前的一个关键帧(或P帧)的差别,解码时需要之前帧的解码结果
-
B 帧(双向预测帧):记录本帧与前后帧的差别,解码时需要前后帧的解码结果,压缩率最好
-
SPS(序列参数集):保存了一组编码视频序列的全局参数,I 帧前至少要发一次
-
PPS(图像参数集):序列中某几幅图像的参数
-
IDR 帧:特殊的 I 帧,图像的刷新点,会清空参考帧队列
-
GOP:一个 IDR 帧到下一个 IDR 帧之前一组连续的视频帧。
-
PTS(显示时间戳):显示的顺序,B 帧先于 P 帧 显示
-
DTS(解码时间戳):编解码顺序和推流顺序,P 帧先于 B 帧编解码
5、音视频格式
封装格式
- MP4
.mp4:支持大部分的编码格式 - MKV
.mkv:支持大部分的编码格式 - MPEG-TS
.ts:支持常见的编码格式,流媒体 - FLV
.flv:主要用于 H.264 视频 + AAC 音频,流媒体
音频编码格式
- MP3:有损压缩,压缩比低
- AAC:有损压缩,压缩比高
- Opus:有损压缩,压缩比高
- PCM:原始音频数据
视频编码格式
- AVC/H.264:有损压缩,压缩比低
- HEVC:有损压缩,压缩比高
- AV1:有损压缩,压缩比高
- VP8/VP9:有损压缩,压缩比高
6、空间视频
- Side-by-Side 格式:每个帧左半部分是左眼图像,右半部分是右眼图像
1920 * 1080 => 960 * 1080 + 960 * 1080
- Top-and-Bottom 格式:每个帧上半部分是左眼图像,下半部分是右眼图像
1920 * 1080 => 1920 * 540 + 1920 * 540
- Frame Packing 格式:左右眼都以其全分辨率组合为一个打包帧
1920 * 1080 => 1920 * 2205
- 空间视频的编码:
- HEVC 标准:由于没有帧内远距离搜索,同一帧的左右半间无法相互预测;除此之外,由于运动估计搜索范围的限制,帧间预测也不能利用不同视点间的信息;
- MV-HEVC 标准:右视点帧间预测的运动矢量使用了大量的视点间参考模式,充分消除了视点间的冗余信息,同画质下减少带宽。Vision Pro 已支持 MV-HEVC 码流的硬解。原理:NALU header 中引入的 Layerld 表示该 NALU 封装的帧(或 Slice)所归属的视点号。通常用 Layerld 0 表示该帧属于左视点(主视点),Layerld 1 则表示属于右视点(辅视点)。我们称同属于一个 POC 但属于不同 Layerld 的帧为一个 AU (Acess Unit)。主视点图像编码的参考规则沿用基础 HEVC,辅视点每一帧图像编码在基础 HEVC 之上,又多了一个视点间参考帧。
7、音视频开发常用工具
- FFmpeg 全家桶:最重要的音视频处理工具,命令行程序
- MediaInfo:分析工具,查看音视频文件格式等详细信息
- 海康 YUV Player:支持多种 YUV 格式的播放和处理
- Adobe Audition:音频分析和处理应用
- FLVParser:FLV 流分析和解析器
- Beyond Compare:二进制文件对比工具