前言
音视频技术较为深奥,以一张图为例:
视频文件的播放,要经历以下几个阶段:
解协议:就是将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒体协议,例如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 YUV:是欧洲电视系统所采用的一种颜色编码方法,以前的旧彩电中一般会有三根线,分别对应这三种信息。其中Y表示亮度信息,U和V表示构成颜色的两个分量或者色差 RGB:一种颜色模型,通过对红绿蓝三个颜色通道的变化以及它们相互之间的叠加来得到各种各样的颜色,rgb三原色,这是大家最熟悉的一种颜色表达方式了
大家肯定对 RGB888 这个词不陌生,它的意思就是每个颜色分量使用8个比特位,即一个像素使用24个比特位,3个字节来表示。RGB也有其它存储格式,常见的即为RGB888。
像 YUV 的格式有两大类,planar和packed
planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。 packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。
YUV的存储格式也有多种,一般用得较多的是YUV420,它表示每四个Y共用一组UV分量,于是这种存储格式的bpp(bit per point)为12,即平均一个像素点使用12个比特位来显示,每个像素都有一个 Y 值,而 U 和 V 的数量均是 Y 的 1/4。Y、U、V 各是一个字节,一个字节是 8 bit,结果就是 1 + 1/4 + 1/4 = 1.5 个字节 = 1.5 * 8 = 12 bit
这里只粗略介绍下yuv,后续再详细总结下。
帧率 帧率(fps),就是指每秒显示帧数,比如我国电影的帧率就是25帧。一般来说,30fps就是可接受的,60fps就可以明显提升交互感和逼真感,超过75帧,人的肉眼就不会再有明显提升了
分辨率: 分辨率就是指视频的图像大小或尺寸
编码格式 :常见的编码格式如h264、MPEG等,编码的目的在于压缩数据量,采用编码算法压缩冗余数据。
大家可以想像下,现在手机随手拍的一张照片大小可达2、3M之多,假设一张图片大小为2M,电影fps为25,那么一秒内显示的数据量为50M,一分钟内数据量为3000M,约为3G,一个电影一般有90分钟,那么,一部电影至少有270G大小。如果数据不压缩,这也太占空间了,这么大的数据量,我国的带宽能承受?人们看视频也不方便。
所以编码就是将一些冗余的东西去除,比如一张图片内肯定会有一些区域内颜色类似相同,这些相同相信的数据就可以被压缩。
- 封装格式 把编码后的音视频数据以一定格式封装到一个容器里,常见的封装格式有AVI、flv等
请注意,音频数据和视频数据是分开的。
- 码率 码率也叫比特率,就是指单位时间内连接的媒体的比特数量,比特率越高,带宽消耗得越多,注意它是指比特数量,并不是字节数量
文件大小(b) = 码率(b/s) * 时长(s)
- DTS和PTS DTS,即decode time stamp,编码时间戳,指标示内存中的比特流什么时候开始送入解码器中进行解码 PTS,即Presentation time stamp,显示时间戳,指解码后的视频帧什么时候被显示出来
这个两值与音视频同步相关,视频的dts和pts并不一定顺序相同,与视频帧类型相关。
视频帧 常见的视频帧有 I P B 帧等 I 帧:关键帧,这一帧画面完整,解码时只需要本帧数据就可以完成解码 P帖:表示这一帧和之前的一个关键帧或者P帧的差别,解码P帧时,需要依赖本帧数据和之前的缓存内容 B帧:双向差别帧,解码时不仅需要本帧数据,也需要前帧和后帧数据
采样率(sample rate) 采样率是指每秒音频采样点的个数,例如音乐cd的采样采样率为44100Hz。
声道 声道是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,常见的有单声道,立体声道等等
采样精度 采样精度可以理解为一个采样点使用多少bit来表示,一般来说,音乐cd使用的采样精度为16bit,即一个音频采样点使用2个字节存储
音频帧 AAC,aac音频一帧当中,一个声道包含1024个采样点,后续说到ffmpeg,会提到一个参数,frame_size,aac它的值即是1024。而音频一帧的播放时间为
音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)
所以aac一帧的播放时间为 1024 * 1000 / 44100 = 22.32ms 乘以一千是因为得到的时间单位是ms
mp3:mp3音频一帧当中,一个声道包含1152个采样点
对于一个音频帧而言,一帧的数据量会是多少呢?如果是aac帧,两个声道,采样精度为16bit,那么数据量为:1024×2×2 个字节