直播基本流程
1.1、采集【AVFoundation】
创建捕捉会话AVCaptureSession:startRunning开始采集
输入源(AVCaptureDeviceInput):从摄像头输入
输入源(AVCaptureDeviceInput):从话筒输入
创建AVCaptureMovieFileOutput 用于将音频视频写入文件
1.2、前处理:美颜,滤镜,水印
【GPUImage】:GPUImage是利用GPU,使在图片和视频上应用不同的效果和滤镜变得非常的容易(120种),同时它还拥有出色的性能,并且它的性能要比苹果内置的相关APIs出色。
如高斯模糊:
let processView =GPUImagePicture(image: sourceImage)
let blurFilter =GPUImageGaussianBlurFilter()
// 纹理大小blurFilter.texelSpacingMultiplier =2.0
processView?.addTarget(blurFilter)
【GPUImage美颜相机】
GPUImageStillCamera->GPUImageFilter->GPUImageView 这样,摄像机转到滤镜再转到view上显示出来.
GPUImageStillCamera* imageCamera;//可以理解为设备
GPUImageFilter* filter;//filter滤镜
viewGPUImageView* iv; //显示出来的
1.3、编码:视频压缩,音频压缩
为了不让用户感受到卡顿效果, 1秒钟之内至少需要16帧画面(正常开发通常会采集30帧)
去除冗余信息的过程,我们就称之为压缩编码
【硬编码】使用GPU解码(ios8之前不可以硬编码,8之后可用VideoToolBox&AudioToolbox)
「优缺点:软参数调整方便,升级易,但CPU负载重,性能比硬低」
「优缺点:硬对CPU无压力,但是对GPU要求较高」
【软编码】使用CPU解码(ffmpeg+x264)(手机发烫):android难以找到统一库兼容平台,通常软编。
【编码标准】音频:AAC、Opus。 视频:H.264(高压缩高质量和支持多种网络的流媒体传输)、H.265、VP8、VP9
【编码流程】:
1、在进行当前信号编码时,编码器首先会产生对当前信号做预测的信号,称作预测信号
2、 得到预测信号后,编码器会将当前信号与预测信号相减得到残余信号(residual signal),并只对残余信号进行编码
3、编码器并不会直接对残余信号进行编码,而是先将残余信号经过变换(通常为离散余弦变换)然后量化以进一步去除空间上和感知上的冗余信息
4、量化后得到的量化系数会再透过熵编码,去除统计上的冗余信息
H.264压缩算法要点:(NAL【网络提取层】+VCL【视频编码层】)
【VCL介绍】
1、在H264协议里定义了三种帧
I帧:完整编码的帧叫I帧
P帧:参考之前的I帧生成的只包含差异部分编码的帧叫P帧
B帧:参考前后的帧编码的帧叫B帧
2、H264采用的核心算法是帧内压缩和帧间压缩
帧内压缩是生成I帧的算法
帧间压缩是生成B帧和P帧的算法
3、H264的压缩方法:
3.1、分组:把几帧图像分为一组GOP,为防止运动变化,帧数不宜取多。
GOP即Group of picture(图像组),指两个I帧之间的距离,也就是一个序列,一个序列的第一个图像叫做 IDR 图像,IDR 图像都是 I 帧图像:如果前一个序列出现重大错误,在这里可以获得重新同步的机会),
3.2、定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
3.3、预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
3.4、数据传输:最后将I帧数据与预测的差值信息进行存储和传输。
【NAL介绍】
3.1、根据不同的网络把数据打包成相应的格式,将VCL产生的比特字符串适配到各种各样的网络和多元环境中。
3.2、I帧、P帧、B帧都是被封装成一个或者多个NALU进行传输或者存储的
3.3、NALU头通常为00 00 00 01,作为一个新的NALU的起始标识
3.4、NALU体封装着VCL编码后的信息或者其他信息
FFMpeg + X264 软编码
FFMpeg:非常强大的音视频处理库,包括视频采集功能、视频格式转换、视频抓图、给视频加水印等
x264:里面集成了非常多优秀的算法用于视频编码
1.4、推流:将编码推送给服务器
将数据经过采集预处理,编码后推流到服务器
【传输协议】RTMP、RTSP、HLS
HLS协议:
HLS:Apple基于HTTP的流媒体传输协议,HLS协议在服务器端将直播数据流存储为连续的、很短时长的媒体文件(MPEG-TS格式),而客户端则不断的下载并播放这些小文件,因为服务器端总是会将最新的直播数据生成新的小文件,这样客户端只要不停的按顺序播放从服务器获取到的文件,就实现了直播。
HLS工作流程为:
采集视频源和音频源的数据
对原始数据进行H264编码和AAC编码
视频和音频数据封装为MPEG-TS包
HLS分段生成策略及m3u8索引文件
HTTP传输协议传输数据
RTMP协议:
基于TCP的应用层协议优势如下:
实时性高,延迟在3S内,若对实时性有要求,建议用RTMP。
支持加密;
稳定性高。
播放一个RTMP协议的流媒体需要经过以下几个步骤:握手,建立连接,建立流,播放。RTMP连接都是以握手作为开始的。建立连接阶段用于建立客户端与服务器之间的“网络连接”;建立流阶段用于建立客户端与服务器之间的“网络流”;播放阶段用于传输视音频数据
RTMP传输媒体数据的过程中,发送端首先把媒体数据封装成消息,然后把消息分割成消息块,最后将分割后的消息块通过TCP协议发送出去。接收端在通过TCP协议收到数据后,首先把消息块重新组合成消息,然后通过对消息进行解封装处理就可以恢复出媒体数据。
推流框架LFLiveKit是一个集成了视频采集-美颜-编码-推流为一体的框架,并且使用起来非常的简单, 我们可以在iOS中直接使用该框架进行推流
1.5、流分发:服务器进一步视频转码
服务端为适配各个平台各种不同协议,需要做一些流处理工作,比如转码成不同格式,支持不同协议等。
1.6、播放
拉流获取数据后,需要编码器解码渲染才可以在播放器上播放:
解协议:取出网络传输过程中一些无用信息
解封装:获取到的是音频&视频放在一起的封装文件
音视频解码:音视频都是经过压缩编码的内容,解码后才能进行播放
音视频同步:视频&音频文件需要通过播放
音视频播放:声卡&显卡等对音视频进行播放