音视频学习笔记(一)

305 阅读3分钟

其实关于音视频的技术有很多很多的内容,本笔记最后的目标是为了制作一个FFMPEG为基础的移动端跨平台的播放器。 在学习基本之前,首先最主要的是了解解码编码的机制,音视频的码流结构等。 其实视频的播放就是在画面上快速显示每一帧的图片,而图片就是来自于封装好的视频文件里(mkv,mp4,avi,flv等等)。

image.png
最终显示到屏幕上的就是解码以后的数据(YUV)等。 所以制作播放器的要点就是稳定的解码各种格式转换成YUV等的显示格式,当然音频也是一样的,音频(PCM)。 现在比较主流的封装格式:视频(基于H.264),音频(基于AAC),首先是谅解这两种格式 H.264:

原理:H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。他们的结构如下图所示。

其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。H.264码流解析的步骤就是首先从码流中搜索0x000001和0x00000001,分离出NALU;然后再分析NALU的各个字段。本文的程序即实现了上述的两个步骤。

AAC:

image.png
--++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。他们的结构如下图所示。

其中每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。本文的程序即实现了上述的两个步骤。

所以如何从格式中截取每一帧 的数据就是首先要完成的任务了。 当然我们现实中看到的mkv,mp4,avi,FLV等等的格式大部分是基于H.264的封装,封装结构各不相同。FLV:

FLV封装原理 FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player插件已经安装在全世界绝大部分浏览器上,这使得通过网页播放FLV视频十分容易。目前主流的视频网站如优酷网,土豆网,乐视网等网站无一例外地使用了FLV格式。FLV封装格式的文件后缀通常为“.flv”。 总体上看,FLV包括文件头(File Header)和文件体(File Body)两部分,其中文件体由一系列的Tag组成。因此一个FLV文件是如图1结构。

图1.文件结构(简图) 其中,每个Tag前面还包含了Previous Tag Size字段,表示前面一个Tag的大小。Tag的类型可以是视频、音频和Script,每个Tag只能包含以上三种类型的数据中的一种。图2展示了FLV文件的详细结构。
图2.FLV文件结构(详图) 下面详细介绍一下三种Tag的Tag Data部分的结构。 (a)Audio Tag Data结构(音频Tag) 音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。结构如图3所示。
图3.Audio Tag Data结构 第1个字节的前4位的数值表示了音频编码类型。如表1所示。 表1.音频编码类型 涵义(原帖):http://blog.csdn.net/leixiaohua1020/article/details/17934487 可以获取该格式资源然后基于H.264解封装,然后再解码。而这部分也就是FFMPEG会帮我们做的事情。