直播流程:
- 1、 采集视频、音频
摄像头 NV21 camera
麦克风 pcm数据- 2、 视频处理
美颜、水印、滤镜- 3、 音视频数据压缩
硬编码:视频MediaCodec 音频AudioTack
软编码:
视频压缩、视频编码 H264 x264将NV21 数据转换成YUV420P
音频压缩、音频编码 AAC- 4、 推流
将采集到的音视频数据,根据流媒体协议推送到流媒体服务器上
将音视频封装成FLV或者TS流- 5、 流媒体服务器数据处理
截屏,获取视频缩略图
录制
实时转码
CDN分发- 6、 拉流
从流媒体服务器上获取音视频数据
通过流媒体协议:RTMP、RTSP、HLS、HTTP- 7、 音视频解码
视频解码:硬解:MediaCodec 软解:H264
音频解码:硬解:AudioTrack 软解:faac- 8、 播放
- 9、 聊天互动
- 10、弹幕
主流的流媒体服务器
- FMS:(Flash media server) Adobe推出的
支持协议:RTMP、RTMPT、RTMPE、RTMPS、RTMFP
商业,收费成本高- Red5 :
暴雪公司 是Java开发的基于flash的流媒体使用RTMP协议,与FMS兼容,MP3和FLV文件转换成流
免费开源,性能差不稳定- Nginx :伪流媒体
c开发的,高性能HTTP和反向代理流媒体服务器,外网反向代理到内网,再响应到到公网
是一个模块化的服务器,部署方便,性能高
RTMP协议:
RTMP是Real Time Messaging Protocol(实时消息传输协议)的首字母缩写。该协议基于TCP,是一个协议簇,包括RTMP基本协议及
RTMPT/RTMPS/RTMPE等多种变种。RTMP是一种设计用来进行实时数据通信的网络协议,主要用来在Flash/AIR平台和支持RTMP协
议的流媒体/交互服务器之间进行音视频和数据通信。
RTMP协议是Adobe公司推出的实时传输协议,主要用于基于flv格式的音视频流的实时传输。得到编码后的视音频数据后,先要进行
FLV包装,然后封包成rtmp格式,然后进行传输。使用RTMP格式进行传输,需要先连接服务器,然后创建流,然后发布流,然后传输
相应的视音频数据。整个发送是用消息来定义的,rtmp定义了各种形式的消息,而为了消息能够很好地发送,又对消息进行了分块处
理,整个协议较为复杂。
音频PCM数据
参数:声道数、采样位数、采样率
1、声道数:单声道、立体声等
2、采样率:每秒钟取得声音样本的次数,频率越高,声质越好,占用资源越多。人耳的分辨率有限,太高也分辨不出。
16位声卡中有22.05KHz和44.1KHz等几级,22.05KHz相当于FM广播的音质,44.1KHz相当于CD的音质了,
目前常用的采样率不超过48KHZ
3、采样位数:衡量声音波动变化的一个参数,也可以说是声卡的分辨率。计算机中采样位数一般有8位和16位。
视频参数:
- 分辨率:视频是由连续的图像构成的。图像则是由像素(pixel)构成的。
一张图像有多少像素,称为这个图像的分辨率。视频的分辨率就是每一帧图像的分辨率。- 帧率:一个视频,每一秒由多少图像构成,称为这个视频的帧率(frame-rate)
- 码率:码率的定义是视频文件体积除以时间。单位一般是Kbps(Kbit/s)或者Mbps(Mbit/s)
H264编码框架:
分为两层:
- 视频编码层(VCL):负责高效的视频内容表示,VCL数据即编码处理的输出,表示被压缩编码后的视频数据序列
- 网络提取层(NAL):负责以网路要求的恰当的方式对数据进行打包和传送,是传输层,网络播放和本地播放都是用此来传输
编码原理:
H264协议里定义了三种帧:I帧、P帧、B帧
H264中图像以序列位单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始到下一个I帧结束。一个序列的
第一个图像叫IDR图像(立即刷新图样),IDR图像都是I帧图像。
H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数
据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得
重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
h264的压缩方法:
- 1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多
- 2.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
- 3.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。
I帧 : 关键帧
I帧:帧内编码帧 ,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)
I帧特点:
1)它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
2)解码时仅用I帧的数据就可重构完整图像;
3)I帧描述了图像背景和运动主体的详情;
4)I帧不需要参考其他画面而生成;
5)I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
6)I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
7)I帧不需要考虑运动矢量;
8)I帧所占数据的信息量比较大。
P帧 :前向预测编码帧
P帧:表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,
生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
P帧的预测与重构:
P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。
在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
P帧特点:
1)P帧是I帧后面相隔1~2帧的编码帧;
2)P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
3)解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
4)P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
5)P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
6)由于P帧是参考帧,它可能造成解码错误的扩散;
7)由于是差值传送,P帧的压缩比较高。
B帧:双向预测内插编码帧
B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,
但我这样说简单些),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本
帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
B帧的预测与重构
B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。
接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。
B帧特点
1)B帧是由前面的I或P帧和后面的P帧来进行预测的;
2)B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
3)B帧是双向预测编码帧;
4)B帧压缩比最高,因为它只反映两参考帧间运动主体的变化情况,预测比较准确;
5)B帧不是参考帧,不会造成解码错误的扩散。。
一般来说,I帧的压缩率是7(跟JPG差不多),P帧是20,B帧可 以达到50。可见使用B帧能节省大量空间,节省出来的
空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。
帧内压缩:
帧内(Intraframe)压缩也称为空间压缩(Spatial compression)。当压缩一帧图像时,仅考虑本帧的数据而不考虑
相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整
的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩,跟编码jpeg差不多。
帧间压缩:
帧间(Interframe)压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。
也即连续的视频其相邻帧之间具有冗余信 息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,
减小压缩比。帧间压缩也称为时间压缩(Temporal compression),它通过比较时间轴上不同帧之间的数据进行压缩。
帧间压缩一般是无损的。帧差值(Frame differencing)算法是一种典型的时间压缩法,它通过比较本帧与相邻帧
之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
无损(Lossy less)压缩:
也即压缩前和解压缩后的数据完全一致。多数的无损压缩都采用RLE行程编码算法。
有损(Lossy )压缩:
意味着解压缩后的数据与压缩前的数据不一致。在压缩的过程中要丢失一些人眼和人耳所不敏感的图像或音频
信息,而且丢失的信息不可恢复。
几乎所有高压缩的算法都采用有损压缩,这样才能达到低数据率的目标。丢失的数据率与压缩比有关,压缩比越小,丢失
的数据越多,解压缩后的效果一般越差。此外,某些有损压缩算法采用多次重复压缩的方式,这样还会引 起额外的数据丢失。
ACC编码特点:
(1) AAC是一种高压缩比的音频压缩算法,但它的压缩比要远超过较老的音频压缩算法,
如AC-3、MP3等。并且其质量可以同未压缩的CD音质相媲美。
(2) 同其他类似的音频编码算法一样,AAC也是采用了变换编码算法,但AAC使用了分辨率
更高的滤波器组,因此它可以达到更高的压缩比。 (3) AAC使用了临时噪声重整、后向自适应线性预测、联合立体声技术和量化哈夫曼编码等最新技术,
这些新技术的使用都使压缩比得到进一步的提高
(4) AAC支持更多种采样率和比特率、支持1个到48个音轨、支持多达15个低频音轨、具有
多种语言的兼容能力、还有多达15个内嵌数据流。 (5) AAC支持更宽的声音频率范围,最高可达到96kHz,最低可达8KHz,远宽于MP3的16KHz-48kHz的范围。 (6)不同于MP3及WMA,AAC几乎不损失声音频率中的甚高、甚低频率成分,并且比WMA在频谱结构上更接近于原始
音频,因而声音的保真度更好。专业评测中表明,AAC比WMA声音更清晰,而且更接近原音。 (7)AAC采用优化的算法达到了更高的解码效率,解码时只需较少的处理能力。
AAC与MP3规格对比
比特率:AAC - 最高超过400kbps / MP3 - 32~320kbps采样率:AAC - 最高96kHz / MP3 - 最高48kHz声道数:AAC - (5.1)六声道 / MP3 - 两声道采样精度:AAC - 最高32bit / MP3 - 最高16bit