音视频数据处理入门
最近因为需要,作为一个小白了解音视频开发。然后找到了雷霄骅所写的多篇基础知识篇,故在此记录。
1. 视音频数据处理入门:RGB、YUV像素数据处理
https://blog.csdn.net/leixiaohua1020/article/details/50534150
2. 视音频数据处理入门:PCM音频采样数据处理
https://blog.csdn.net/leixiaohua1020/article/details/50534316
3. 视音频数据处理入门:H.264视频码流解析
https://blog.csdn.net/leixiaohua1020/article/details/50534369
4. 视音频数据处理入门:AAC音频码流解析
https://blog.csdn.net/leixiaohua1020/article/details/50535042
5. 视音频数据处理入门:FLV封装格式解析
https://blog.csdn.net/leixiaohua1020/article/details/50535082
6. 视音频数据处理入门:UDP-RTP协议解析
https://blog.csdn.net/leixiaohua1020/article/details/50535230
上述几篇文章,从编码入手,主要讲述一些音视频数据处理的基础知识。
雷霄骅将其统筹于一个项目:https://gitee.com/leixiaohua1020/simplest_mediadata_test
就上述文章,我稍微提取了一些我所需要的知识如下。
一、音视频数据处理流程
从网络上获取的音视频数据需要经历解协议、解封装、音视频解码、视音频同步四步。如果是本地文件则不需要解协议,只有三步。
各层数据使用到的格式如下。(下面只列举了部分)
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
二、视频像素数据
视频像素数据格式主要为YUV和RGB。
1、YUV
YUV格式的数据在文件中的存储数据为像素点的Y、U、V数据。具体存储方式各种YUV格式都有所不同。下面以一个宽高分别为w和h的视频帧,且像素采样位率为8bit的存储介绍。
比如YUV420P格式,先存储w*h Byte的Y,然后存储w*h/4的U,最后存储w*h/4的V。
比如YUV440P格式,先存储w*h Byte的Y,然后存储w*h的U,最后存储w*h的V。
1.1 Y、U、V介绍
Y是亮度数据。UV是两个色度分量。
1.2 YUV格式
1.2.1 采样格式
YUV有三种采样格式。
- 4:4:4,每一个Y对应一组UV分量,一个YUV占8+8+8 = 24bits 3个字节。
- 4:2:2,每两个Y共用一组UV分量,一个YUV占8+4+4 = 16bits 2个字节。
- 对于[Y0U0V0] [Y1U1V1] [Y2U2V2] [Y3U3V3]对于这四个像素,采样之后存放的码流为:[Y0U0 Y1V1 Y2U2 Y3V3],占用的内存大小为4+4/2 +4/2=8
- 4:2:0,每四个Y共用一组UV分量,一个YUV占8+2+2 = 12bits 1.5个字节。
- 对于[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3] [Y4 U4 V4] [Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] 。采样之后存放的码流为Y0 U0 Y1 Y2 U2 Y3 Y4 V4 Y5 Y6 V6 Y7。
- YUV 4:2:0 采样,并不是指只采样 U 分量而不采样 V 分量。而是指,在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。
对于我们常用的YUV420P采用的就是4:2:0采样格式。
1.2.2 存储格式
存储格式多种多样,此处仅列出部分。
YUV422、YUV422P、YUV422SP
YU12(android下也叫I420)、YV12
NV21、NV12
2、RGB
RGB的每个像素点使用各一Byte的R、G、B表示。在存储中,一个像素点的RGB数据相邻。
BMP图片(bitmap)内部实际上存储的就是RGB数据。只是增加了“B”“M”标识和一些头部信息。
BMP文件是由bitmapfileheader,bitmapinfoheader、RGB像素数据三部分构成的。且BMP文件开头由'B''M'两个字符标识。
BMP save R1|G1|B1,R2|G2|B2 as B1|G1|R1,B2|G2|R2。
三、音频采样数据
PCM16LE,一个音频数据用两字节数据表示,使用小端存储。
四、H.264视频码流
H.264原始码流(裸流)的基本单元是NALU。每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的分片为一帧的开始就用0x00000001,否则就用0x000001。
五、ACC音频码流
AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。
六、FLV封装格式
FLV封装格式是由一个FLV Header文件头和一个一个的Tag组成的。Tag中包含了音频数据以及视频数据。

七、UDP-RTP协议解析

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用