目录
[1.1 音频部分](#1.1 音频部分)
[1.2 视频部分](#1.2 视频部分)
[1.3 文件封装](#1.3 文件封装)
[1.4 时钟](#1.4 时钟)
[2.1 媒体解复用器](#2.1 媒体解复用器)
[三、 图像基础概念](#三、 图像基础概念)
[3.1.1 像素](#3.1.1 像素)
[3.1.2 分辨率](#3.1.2 分辨率)
[3.1.3 位深](#3.1.3 位深)
[3.1.4 帧率](#3.1.4 帧率)
[3.1.5 码率](#3.1.5 码率)
[3.1.6 Stride跨距](#3.1.6 Stride跨距)
[4.1 RGB](#4.1 RGB)
[4.2 YUV](#4.2 YUV)
[4.2.1 YUV采集表示法](#4.2.1 YUV采集表示法)
[4.2.2 YUV数据存储](#4.2.2 YUV数据存储)
[4.3 YUV和RGB之间的转换](#4.3 YUV和RGB之间的转换)
[4.4 YUV Stride对齐问题](#4.4 YUV Stride对齐问题)
一、音视频录制原理

音视频录制涉及麦克风采集声音和摄像头采集画面。摄像头采集回来的数据可以用RGB或YUV表示,YUV是一种颜色编码方法。麦克风采集回来的数据用PCM表示。采帧率是每秒采集的次数,决定音频的质量。
1.1 音频部分
音频采集与表示
- **数据表示:**音频数据采用PCM格式表示,即脉冲编码调制,是未经压缩的原始音频数据格式
- **采样帧:**以20毫秒左右的音频数据作为一帧进行编码压缩,平衡处理延迟和数据量。例如44.1kHz采样率表示每秒采集44100个采样点
音频处理
- **处理目的:**可进行变声等效果处理,如将尖锐声音调整为低沉音色
- 压缩必要性:举例说明4分钟未压缩音频约为40M(44.1kHz/双通道/16bit),压缩后仅4M左右,压缩比达10:1
队列与编码
- **采集帧队列:**类似缓冲区,采集数据先存入队列等待编码线程读取,实现生产消费解耦
- 编码原理:通过编码算法大幅度减少数据量,为后续文件存储做准备
1.2 视频部分
视频采集与表示
- **数据格式:**可采用RGB或YUV格式表示图像帧
- **帧率概念:**每秒采集的帧数(如25fps/15fps),直接影响视频流畅度和数据量。
图像处理
- **功能处理:**可调整画面亮度等参数,例如提升暗光环境下的画面亮度
队列与编码
- **图像帧队列:**采集的原始帧先存入队列,等待视频编码线程处理
- **压缩必要性:**举例1920分辨率RGB图像约3M/帧,25fps时达75M/秒,90分钟影片将达405G,必须进行编码压缩
1.3 文件封装
- **复用器作用:**将编码后的音视频数据特定格式(如MP4)写入同一文件,包含解复用所需的元数据信息
1.4 时钟
时钟作用
- **同步基础:**为音视频帧打上统一的时间戳(如0.1秒采集的音频帧和视频帧标记相同时间戳),确保播放时能精确同步
- **播放控制:**拖动进度条时依赖时间戳定位对应帧,避免音画不同步(如音频播到第10帧时视频应播对应时间戳的帧)
实现要点
- **时钟源统一:**必须使用同一时钟源为音视频数据打时间戳,确保时间基准一致。例如麦克风和摄像头需同步到同一系统时钟
二、音视频播放原理

**逆向过程:**播放是录制的逆向解析过程,媒体文件位置从录制时的输出端变为播放时的输入端
**处理流程:**媒体文件---解复用器---音视频分离---队列缓存---解码---帧队列---同步控制---输出设备
2.1 媒体解复用器
- **功能对比:**与复用器互为逆向过程,录制时复用器将音视频合并写入文件,播放时解复用器按格式规则(如MP4)分离音视频
- 队列作用:
- **数据缓冲:**音频包队列和视频包队列暂存数据,等待解码线程获取
- **同步准备:**解码后的帧数据存入帧队列,为音视频同步控制提供缓冲空间
- 后期处理:
- **音频处理:**可进行音频算法处理,如调节重低音等参数
- **图像处理:**支持调整亮度、锐度、色彩等图像参数
- 同步控制:
- **位置可变:**根据实际需求,同步控制模块可能调整位置(如偏向音频端)
- **缓存机制:**通过帧队列实现数据暂存,确保同步时数据可用性
三、 图像基础概念
3.1.1 像素
像素是一个图片的基本单位,简称px。视觉表现为图像放大后可见由小方块组成的网格,每一个小方格就是一个像素点。例如2500*2000的照片表示横向2500个像素点,竖向2000个像素点,总像素500万,俗称500万像素照片。
3.1.2 分辨率
**基本定义:**指图像的大小或尺寸。比如1920*1080。
|-------|------------|
| 360P | 640*360 |
| 720P | 1280*720 |
| 1080P | 1920*1080 |
| 4K | 3840*2160 |
| 8K | 7680*4320 |
[常见标准]
**命名规则:**常说的1080/720指垂直像素数,水平像素数按16:9比例计算(如720p水平像素=720/9*16=1280)
**像素总量:**720P(1280*720),1080P(1920*1080)
**清晰度关系:**像素越多视频越清晰,但需要注意光线条件也会影响实际清晰度
**视觉对比:**高分辨率图像在放大后细节保留更好,如草地纹理和蘑菇细节更清晰可见
3.1.3 位深
**基本定义:**指在记录数字图像的颜色时,计算机实际上使用每个像素需要的位深来表示的
**通道组成:**我们看见的彩色照片,都有三个通道,红(R)、绿(G)、蓝(B)。(如果需要透明度则还有Alpha分量)
位深表示: 通常每个通道用8bit表示,可表示256种颜色,三通道组合为256*256*256=1677万色。这里的8bit就是位深。每个通道的位深越大,能够表示的颜色值就越大。
3.1.4 帧率
**基本定义:**在一秒时间内传输图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次
**性能影响:**帧率越高画面越流畅,但需要更高硬件性能支持
3.1.5 码率
**基本定义:**视频文件在单位时间内使用的数据流量。比如1Mbps
与清晰度关系:
- 同源同编码时,码率越高失真越小,画面越清晰
- 受原始画质影响(如夜间拍摄高码率可能不如日照间低码率)
- 非线性增长,即清晰度随码率提升存在边际效应
3.1.6 Stride跨距
基本定义: 指在内存中每行像素占用的空间。为了实现内存对齐每行像素在内存中所占的空间并不一定是图像的宽度
Stride就是这些扩展内容的名称,Stride也被称为Pitch,如果图像的每一行像素末尾拥有扩展内容,Stride的值一定大于图像的宽度值。
四、RGB/YUV讲解
**RGB:**红R、绿G、蓝B三基色
**YUV:**Y表示明亮度,也就是灰阶值。U和V表示色度
4.1 RGB
通常图像像素按RGB顺序排列,但OpenCV等应用需要转为BGR排序

带Alpha通道格式:
**ARGB:**透明通道在前,如AV_PIX_FMT_ARGB格式
**RGBA:**透明通道在后,如AV_PIX_FMT_RGBA格式
**ABGR/BGRA:**类似但采用BGR排序顺序
注意事项:处理色彩像素时必须确认所需格式,传错格式会导致显示或数据处理错误
4.2 YUV
4.2.1 YUV采集表示法
YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为多种具体的格式
打包(packed)格式:将每个像素点的Y、U、V分量交叉排序并以像素点为单元连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素
平面(planar)格式:使用三个数据分开连续的存放Y、U、V三个分量,即Y、U、V分别存放在各自的数组中

下图中黑点表示采样像素点Y分量,空心圆表示采样像素点的UV分量。分别为YUV 4.4.4、YUV 4.2.2、YUV4.2.0这几种常见的类型

4.4:4采样:每个Y对应着独立的U和V分量,无下采值
4:2:2采样:水平2:1下采集,两个Y共用一个UV
4:2:0采集:水平和垂直都2:1下采集,四个Y共用一组UV
带宽优势:通过色度下采样可减少数据量而不显著影响画质
4.2.2 YUV数据存储
4:2:0格式-YUV420P

存储特点:
- 平面格式(planar): Y、U、V分量分别存储
- 数据量: 每个像素平均1.5字节(12bit)
- FFmpeg标识:AV_PIXFMT_YUV420P,
排列规律: 每4个Y分量对应一组UV分量
别名: I420格式(在x264编码器中常用)
4:2:0格式-NV12

混合存储模式:
- Y分量平面存储
- UV分量打包(packed)交错存储
FFmpeg标识: AV PIXFMT_NV12
常见变种:
- NV21: UV分量顺序相反(VU交错)
- YV12: V分量在前,U分量在后
播放注意事项: 必须严格匹配格式参数,否则会出现花屏
4.3 YUV和RGB之间的转换
通常情况下RGB和YUV直接的相互转换都是调用接口实现,比如Ffmpeg的swscale或者libyuv等库。
主要转换标准是 BT601 和 BT709.
8bit位深的情况下
- TVrange是16-235(Y)、16-240(UV),也叫Limited Range
- PCrange是0-255,也叫Full Range
- 而RGB没有range之分,全是0-255
BT601 TV Range转换公式
- 转换后需做数值裁剪(小于0取0,大于255取255)
4.4 YUV Stride对齐问题
比如分辨率638x480的YUV420P图像,我们在内存处理的时候如果要以16字节对齐,则638不能被16整除,我们需要在每行尾部填充2个字节。就是640此时该图片的Y stride为640字节。

U分量计算:638/2=319 →19不能被16整除需补1字节→320。V分量与U分量相同。