推流:LFLiveKit这个框架集成了以下框架:
GPUImage(本身集成了AVFoundation框架):美颜+滤镜+水印
X264框架:H264编码
FFempeg:ACC编码
RTMP协议:推流
播放:ijkplayer内部集成了以下框架:
FFempeg:音视频解码
AVFoundation:视频播放
服务器:nginx+rtmp+ffmpeg
直播APP架构.pngGPUImage对AVFundation进行了一层封装,所以GPUImage框架已经集成了视频的录制
屏幕快照 2018-06-07 上午10.17.55.png 屏幕快照 2018-06-07 上午10.17.55 2.pngHLS 也有它的优点:
数据通过 HTTP 协议传输,所以采用 HLS 时不用考虑防火墙或者代理的问题。
使用短时长的分片文件来播放,客户端可以平滑的切换码率,以适应不同带宽条件下的播放。
HLS 是苹果推出的流媒体协议,在 iOS 平台上可以获得天然的支持,采用系统提供的 AVPlayer 就能直接播放,不用自己开发播放器。
RTMP 优缺点:
RTMP 协议时,从采集推流端到流媒体服务器再到播放端是一条数据流,因此在服务器不会有落地文件。这样 RTMP 相对来说就有这些优点:
延时较小,通常为 1-3s。
基于 TCP 长连接
因此业界大部分直播业务都会选择用 RTMP 作为流媒体协议。通常会将数据流封装成 FLV 通过 HTTP 提供出去。但是这样也有一些问题需要解决:
iOS 平台没有提供原生支持 RTMP 或 HTTP-FLV 的播放器,这就需要开发支持相关协议的播放器。(ijkplayer框架很好支持了RTMP协议,包括音视频解码)
推送服务器流程:
通过AVCaptureSession这么一个捕捉会话,指定两个AVCaptureDevice 也就是iOS的摄像头和麦克风,获取个原始视频和音频,然后需要进行个H.264的视频编码和AAC的音频编码,再将编码后的数据整合成一个音视频包,通过rmtp推送到nginx服务器
采集、美颜、推流有LFLiveKit,
拉流播放有IJKMediaFramework(ijkplayer这个播放器框架集成了拉流、音视频解码、视频播放等强大功能)
直播整个技术 流程:
GPUImage 进行音视频的采集 + 美颜处理 ——>音视频原生文件包 ——>ffempeg进行音频ACC编码处理+X264进行视频H264编码处理 + 打包 ——>libremp框架进行RTMP协议推流 ——>通过ijkplayer框架进行播放(集成音频AudioTooBox和视频VideoToolBox的音视频解码+视频播放等功能)
数据采集原理:
下面将利用 ios 上的摄像头,进行音视频的数据采集,主要分为以下几个步骤:
- 音视频的采集,ios 中,利用 AVCaptureSession和AVCaptureDevice 可以采集到原始的音视频数据流。
- 对视频进行 H264 编码,对音频进行 AAC 编码,在 ios 中分别有已经封装好的编码库来实现对音视频的编码。
- 对编码后的音、视频数据进行组装封包;
- 建立 RTMP 连接并上推到服务端。
- ps:由于编码库大多使用 c 语言编写,需要自己使用时编译,对于 ios,可以使用已经编译好的编码库。
- x264****编码:(复制此链接到浏览器打开)
- faac****编码:(操作同上)
- ffmpeg****编码:(操作同上)
- 关于如果想给视频增加一些特殊效果,例如增加滤镜等,一般在编码前给使用滤镜库,但是这样也会造成一些耗时,导致上传视频数据有一定延时。
iOS中的支持的视频格式:mp4、m4v、m4a、3gp、3g2
音频格式:caf、wav、aif、aifc、amr、mp3、ac3、eac3
图片:jpg、jpeg、dng、heic、avci、heif、tiff
//下面是视频格式(用来转换视频格式)
AVFileTypeQuickTimeMovie //.mov and .qt
AVFileTypeMPEG4//.mp4
AVFileTypeAppleM4V//.m4v
AVFileTypeAppleM4A//.m4a
AVFileType3GPP//.3gp, .3gpp, and .sdv NS_AVAILABLE(10_11, 4_0);
AVFileType3GPP2//.3g2, .3gp2 NS_AVAILABLE(10_11, 4_0);
AVFileTypeCoreAudioFormat//.caf NS_AVAILABLE(10_7, 4_0);
AVFileTypeWAVE//.wav, .wave, and .bwf NS_AVAILABLE(10_7, 4_0);
//下面是音频格式(用来转换音频格式)
AVFileTypeAIFF//.aif and .aiff NS_AVAILABLE(10_7, 4_0);
AVFileTypeAIFC//.aifc and .cdda NS_AVAILABLE(10_7, 4_0);
AVFileTypeAMR//.amr NS_AVAILABLE(10_7, 4_0);
AVFileTypeMPEGLayer3//.mp3 NS_AVAILABLE(10_9, 7_0);
AVFileTypeSunAU//.au and .snd NS_AVAILABLE(10_9, 7_0);
AVFileTypeAC3//.ac3 NS_AVAILABLE(10_9, 7_0);
AVFileTypeEnhancedAC3//.eac3 NS_AVAILABLE(10_11, 9_0);
//下面是图像的格式(用来转换图片格式)
AVFileTypeJPEG//.jpg or .jpeg NS_AVAILABLE(10_13, 11_0);
AVFileTypeDNG//.dng NS_AVAILABLE(10_13, 11_0);
AVFileTypeHEIC//.heic NS_AVAILABLE(10_13, 11_0);
AVFileTypeAVCI//.avci NS_AVAILABLE(10_13, 11_0);
AVFileTypeHEIF//.heif NS_AVAILABLE(10_13, 11_0);
AVFileTypeTIFF//.tiff or .tif NS_AVAILABLE(10_13, 11_0);
*/