视音频解码基础知识
1.音视频的基本概念
1.1视频基本概念
视频:静止的画面叫图像(picture)。连续的图像变化每秒超过24帧(frame)画面以上时,根椐视觉暂留原理,人眼无法辨别每幅单独的静态画面,看上去是平滑连续的视觉效果。这样的连续画面叫视频。当连续图像变化每秒低于24帧画面时,人眼有不连续的感觉叫动画(cartoon)。
帧率:帧/秒(frames per second)的缩写,也称为帧速率,测量用于保存、显示动态视频的信息数量。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅,可理解为秒钟时间里刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,也就是指每秒钟能够播放(或者录制)多少格画面。
分辨率:一个表示平面图像精细程度的概念,通常它是以横向和纵向点的数量来衡量的,表示成水平点数垂直点数的形式,在计算机显示领域我们也表示成“每英寸像素”(ppi)。在一个固定的平面内,分辨率越高,意味着可使用的点数越多,图像越细致。
1.2音频基本概念
声音:由物体振动产生的声波。因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。
采样:波是无限光滑的,采样的过程就是从波中抽取某些点的频率值,即把模拟信号数字化。如下图所示:
采样率:录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。采样频率一般共分为22.05KHz、44.1KHz、48KHz三个等级。8KHz - 电话所用采样率, 对于人的说话已经足够,22.05KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些。
采样位数:记录每次采样值数值大小的位数。采样位数通常有8bits或16bits两种,采样位数越大,所能记录声音的变化度就越细腻,相应的数据量就越大。
声道数:声道数是指支持能不同发声的音响的个数,它是衡量音响设备的重要指标之一。
单声道的声道数为1个声道;双声道的声道数为2个声道;立体声道的声道数默认为2个声道;立体声道(4声道)的声道数为4个声道。
码率:码率 = 采样率 * 采样位数 * 声道数
如果是CD音质,采样率44.1KHz,采样位数16bit,立体声(双声道),码率 = 44.1 * 16 * 2 = 1411.2Kbps = 176.4KBps,那么录制一分钟的音乐,大概10.34MB。
音频帧:音频数据是流式的,本身没有明确的一帧帧的概念,在实际的应用中,为了音频算法处理/传输的方便,一般约定俗成取2.5ms~60ms为单位的数据量为一帧音频。这个时间被称之为“采样时间”,其长度没有特别的标准,它是根据编解码器和具体应用的需求来决定的。
1.3流的基本概念
流特征:随着网络的发展,人们对在线收听音乐提出了要求,因此也要求音频文件能够一边读一边播放,而不需要把这个文件全部读出后然后回放,这样就可以做到不用下载就可以实现收听了。也可以做到一边编码一边播放,正是这种特征,可以实现在线的直播,架设自己的数字广播电台成为了现实。
流媒体:指采用流式传输的方式在Internet / Intranet播放的媒体格式.流媒体的数据流随时传送随 时播放,只是在开始时有些延迟边下载边播入的流式传输方式不仅使启动延时大幅度地缩短,而且对系统缓存容量的需求也大大降低,极大地减少用户用在等待的时间。
2.视频播放基本流程
视频播放基本流程3.名词解释
3.1解协议
解协议:将流媒体协议的数据解析为标准的相应的封装格式数据。
常见的流媒体协议有HTTP,RTMP。
播放网络视频文件需要解协议,播放本地视频文件不需要解协议。
3.2封装与解封装
封装:将视频流、音频流甚至是字幕流捆绑到一个单独的文件中,作为一个信号进行传输。
解封装:将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据以及字幕数据。
封装与解封装整个过程,都不对原来的视频、音频或字幕重新编码。混流(封装、打包)后的文件,可以通过分离(分解、解包)操作,获得与原始素材一模一样的独立的视频、音频和字幕文件。
常见的封装格式:AVI、MP4、TS、FLV、MKV、RMVB。
FLV封装格式是由一个FLV Header文件头和一个一个的Tag组成的。Tag中包含了音频数据以及视频数据。FLV的结构如下图所示:
3.3编码与解码
编码:通过一定协议或规则把一段声音或图像转化成计算机数字文件的过程。
视频编码:将视频像素数据(RGB,YUV等)压缩成为视频码流,从而降低视频的数据量。
当前使用最多的视频编码方案是H.264。H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。他们的结构如下图所示:
其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。
H.264码流解析的步骤就是首先从码流中搜索0x000001和0x00000001,分离出NALU;然后再分析NALU的各个字段。
音频编码:将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。常见的音频编码方案有AAC、MP3、WMA。
AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。他们的结构如下图所示:
其中每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。
××ps: AAC存在两种格式音频格式:ADIF 和 ADTS。
直播服务普遍采用了RTMP作为流媒体协议,FLV作为封装格式,H.264作为视频编码格式,AAC作为音频编码格式。采用RTMP作为直播协议的好处在于其被Flash播放器支持。
解码:编码的逆过程,把编码过的媒体文件重新转化成声音或图像。
用来执行编码工作的软件叫“编码器”(Coder 或 Encoder),
用来执行解码工作的软件叫“解码器”(Decoder),
“编码器”与“解码器”合称“编解码器”(“Codec”)。
用来编码音频流的软件叫作“音频编码器”(Audio Encoder)
用来编码视频流的软件叫作“视频编码器”(Video Encoder)
用来解码音频流的软件叫作“音频解码器”(Audio Decoder)
用来解码视频流的软件叫作“视频解码器”(Video Decoder)
音频流与视频流的处理必须分别进行,即:
“音频编码器”编码出单个音频文件,
“视频编码器”编码出单个视频文件,
“音频解码器”单独对音频文件进行解码还原,
“视频解码器”单独对视频文件进行解码还原。
3.4视音频同步
视音频同步:根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。
视频和音频的同步实际上是一个动态的过程,同步是暂时的,不同步则是常态。以选择的播放速度量为标准,快的等待慢的,慢的则加快速度,是一个你等我赶的过程。
播放速度标准量的的选择一般来说有以下三种:
将视频同步到音频上:以音频的播放速度为基准来同步视频。视频比音频播放慢了,加快其播放速度;快了,则延迟播放(FFmpeg采用这种方式)。
将音频同步到视频上:以视频的播放速度为基准来同步音频。
将视频和音频同步外部的时钟上:选择一个外部时钟为基准,视频和音频的播放速度都以该时钟为标准。
参考:
http://www.jianshu.com/p/0627dd2eb272
http://www.codexiu.cn/android/blog/13575/
http://blog.csdn.net/haomcu/article/details/7072707
http://blog.csdn.net/leixiaohua1020/article/details/18893769