开篇
一直对音视频这块比较感兴趣,但是一直不知道从何下手,终于找到了比较好的资料,希望通过接下来的时间好好研究一下FFMPEG相关的知识,这里感谢一下雷霄骅大神,大神虽去但是留下来多少经典的文章,虽然都是通信出身,相比之下太多惭愧,唯有努力学习了。希望通过简书能够记录学习过程中的心得体会,以及觉得重要的知识点,以作备忘。
音视频编码技术基础
我们常见的avi,rmvb,mp4,flv,mkv等格式的视频,他们的后缀代表的是他们的封装格式的不同,就是把视频数据和音频数据按照既定的规范进行打包个和规范。但是这个后缀只是一种简单的方式我们并不能发现他其中的编码标准,通过mac的显示文件简介我们可以看到,他采用了AAC的音频编码和H.264的压缩编码标准。
- 视频播放器原理
如上图所示,视频播放主要主要几个步骤主要为:解协议(网络视频) - >解封装->视频解码 ->视音频同步
个人理解可以简单的概括为一下内容:协议有RTMP,HTTP等,解析仪后得到FLV(RTMP协议解析的)等形式的数据。之后我们再对FLV等格式的数据进行解封装,得到的是H.264编码的视频码流和AAC编码的音频码流。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。
- H.264和AAC
H.264将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量,目前H.264是主流的编码标准,目前主流的直播软件大部分使用的都是这种编码方式。
AAC音频编码的主要作用是将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。 - 直播和点播的对比
目前主流的直播软件采用的技术一般都是,RTMP协议+FLV格式+H.264视频编码格式+AAC音频编码格式
点播平台采用的技术:HTTP协议+FLV格式或MP4格式+H.264视频编码格式+AAC音频编码格式
RGB、YUV像素数据处理
YUV主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或Luma),也就是灰阶值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色,YUV百度百科介绍。
H.264视频码流解析
原文:视音频数据处理入门:H.264视频码流解析,包含代码。
H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。1个NALU存储1帧画面的压缩编码后的数据。压缩方法能够将图像数据压缩100倍以上。
他们的结构如下图所示。
其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。
H.264码流解析的步骤就是首先从码流中搜索0x000001和0x00000001,分离出NALU;然后再分析NALU的各个字段。
那么NALU指的是什么呢?由文中的代码可以看到NALU分为多个类型。H264在网络传输的是NALU,NALU的结构是:NAL头+RBSP,实际传输中的数据流如图所示:
H264--2--语法及结构对NAL头和RBSP讲解还是比较多的,推荐。
源码中我们提供H.264源码的文件,通过C语言代码的程序能够打印出视频码流解析的数据。如果我们使用ESEyE工具,显示H.264的源数据文件,显示的内容如下:
上图中纵坐标代表数据量的大小
I帧 当做一张图片直接压缩 不依赖于其他的帧
P帧 会依赖前面的帧 不在存储 I帧 已经存储的数据
B帧 依赖于前面的帧和后面的帧 双向参考 达到更大的压缩率
AAC音频码流解析
原理:AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。他们的结构如下图所示。
其中每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。
原文包含AAC音频码流解析代码。
FLV封装格式解析
FLV封装格式是由一个FLV Header文件头和一个一个的Tag组成的。Tag中包含了音频数据以及视频数据。FLV的结构如下图所示。
原文包含FLV封装格式解析代码.
后记
看完这几篇博客研究了下C的代码,觉得懵懵懂懂,坚持下去吧,接着学习去吧。