视频直播

直播基本流程

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、播放

       拉流获取数据后,需要编码器解码渲染才可以在播放器上播放:

      解协议:取出网络传输过程中一些无用信息

      解封装:获取到的是音频&视频放在一起的封装文件

      音视频解码:音视频都是经过压缩编码的内容,解码后才能进行播放

      音视频同步:视频&音频文件需要通过播放

      音视频播放:声卡&显卡等对音视频进行播放

你可能感兴趣的:(视频直播)