#直播总结 ##1.概述关于直播的技能文章不少,成体系的不多。我们将用这篇文章,更系统化地介绍当下大热的视频直播各环节的关键技能,帮助视频直播创业者们更全面、深入地相识视频直播技能,更好地技能选型。###1.1 一个完备的直播APP原理直播原理 : 把主播录制的视频,推流送到服务器,服务器颠末处理惩罚(鉴黄等),通过CDN分发给观众看。 直播环节 : 推流端(收罗、美颜、编码、推流),服务端处理惩罚(转码、录制、截图、鉴黄)、播放器(拉流、解码、渲染)、互动系统(聊天室、礼物系统、赞)###1.2 一个完备直播APP实现流程1.收罗、2.滤镜处理惩罚、3.编码、4.推流、5.CDN分发、6.拉流、7.解码、8.播放、9.聊天互动
###1.3 一个完备直播APP架构1.收罗端、服务端、播放端 ###1.4 一个完备直播APP技能点 下面我们会选择一部分技能进行讲解。 提示:总结不好 图看不清 请点这里
##2. 视频收罗###2.1 根本知识介绍AVFundation : 音视频数据收罗需要用AVFundation框架 AVCaptureDevice : 硬件装备,包罗麦克风、摄像头、通过该对象可以设置物理装备的一些属性。例如相机焦距,白平衡等
AVCaptureDeviceInput : 硬件输入对象,可以根据AVCaptureDevice创建对应的AVCaptureDeviceInput对象,用于管理硬件输入数据
AVCaptureOutput : 硬件输出对象,用于吸收各类输出数据,通常使用对应的子类AVCaptureAudioDataOutput(声音数据输出对象), AVCaptureVideoDataOutput(视频输出对象)
AVCaptureConnection : 当把一个输入和输出添加到AVCaptureSession后。AVCaptureSession就会在输出、输出装备之间创建毗连,而且通过AVCaptureOutput可以获得这个对象
AVCaptureVideoPreviewLayer : 相机拍摄预览图层,能及时检察相机效果。创建该对象需要指定对应的AVCaptureSession对象,因为AVCaptureSession包罗输出数据,有视频数据才能显示。
AVCaptureSession : 协调输入与输出之间通报数据
###2.2 捕获音视频步骤包罗关系: 步骤: 创建AVCaptureDevice(video大概audio) 根据AVCaptureDevice创建AVCaptureDeviceInput。 创建AVCaptureSession 把创建的AVCaptureDeviceInput参加AVCaptureSession 添加视频预览图层AVCaptureVideoPreviewLayer 创建AVCaptureAudioDataOutput,并参加AVCaptureSession 启动会话
官方步骤(可以忽略): 创建AVCaptureSession对象 获取AVCaptureDevice录像装备(摄像头),灌音装备(麦克风)。只用于设置 根据音频/视频硬件装备(AVCaptureDevice)创建音频/视频硬件输入数据对象(AVCaptureDeviceInput),专门管理数据输入。 创建视频输出数据管理对象(AVCaptureVideoDataOutput),并且设置样品缓存代理(setSampleBufferDelegate)就可以通过它拿到收罗到的视频数据 创建音频输出数据管理对象(AVCaptureAudioDataOutput),并且设置样品缓存代理(setSampleBufferDelegate)就可以通过它拿到收罗到的音频数据 将数据输入对象AVCaptureDeviceInput、数据输出对象AVCaptureOutput添加到媒领会话管理对象AVCaptureSession中,就会自动让音频输入与输出和视频输入与输生产生毗连. 创建视频预览图层AVCaptureVideoPreviewLayer并指定媒领会话,添加图层到显示容器layer中 启动AVCaptureSession,只有开启,才会开始输入到输出数据流传输
其中AVCaptureAudioDataOutput、AVCaptureVideoDataOutput包罗两个代理方法,可以不停监听捕获属性。 - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{ if (self.videoConnection == connection) { NSLog(@"收罗到视频"); } else if(self.audioConnection == connection) { NSLog(@"收罗到音频"); }}// 丢失帧会调用这里- (void)captureOutput:(AVCaptureOutput *)captureOutput didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection NS_AVAILABLE(10_7, 6_0){ NSLog(@"丢失帧");}不清楚可以看 : 官方文档 ###2.3 捕获图片AVCaptureStillImageOutput可以将捕获到的Video转换为图片。 创建device 根据device创建deviceInput 添加deviceInput进session 添加预览图层 添加deviceOutput进session 调用AVCaptureConnection生成图片
###2.4 捕获视频AVCaptureMovieFileOutput 可以将捕获到的视频输出到磁盘。可以设置录制最长时限或录制到特定巨细,还可以设置成保存最小可用磁盘空间。 创建device 根据device创建deviceInput 添加deviceInput进session 添加预览图层 添加deviceOutput进session 调用AVCaptureMovieFileOutput把视频写入文件
AVCaptureMovieFileOutput包罗有几个代理方法。分别是视频开始录制,视频暂停,视频恢复, 视频将要录制完成, 视频录制完成。
#2.5 收罗音频视频按帧输出流程剖析 1.找到物理装备摄像头_inputCamera、麦克风_microphone,创建摄像头输入videoInput和麦克风输入audioInput; 2.设置videoInput和audioInput为_captureSession的输入,同时设置videoOutput和audioOutput为_captureSession的输出,并且设置videoOutput和audioOutput的输出delegate; 3._captureSession调用startRunning,开始捕获信号; 4.音频数据到达,把数据转发给之前设置的audioEncodingTarget,并通过调用assetWriterAudioInput的appendSampleBuffer方法写入音频数据; 5.视频数据到达,视频数据传入响应链,颠末处理惩罚后通过assetWriterPixelBufferInput的appendSampleBuffer方法写入视频数据; 6.选择生存后,文件通过ALAssertLibrary写入手机照片库。
流程图: ###2.6 Demo在这里代码 : 捕获音视频Demo ##3. GPUImage前面好像没看懂,可以看这里吗? 可以,GPUImage对AVFundation进行了一层封装,就算你不会前面的也不要紧。###3.1 根本概念GPU 手机大概电脑用于处理惩罚图像渲染的硬件 OpenGL ES 一套图形与硬件接口,用于把处理惩罚好的图片显示到屏幕上。
GPUImage 是一个基于OpenGL ES 2.0图像和视频处理惩罚的开源iOS框架,提供各种各样的图像处理惩罚滤镜,并且支持照相机和摄像机的及时滤镜,内置120多种滤镜效果,并且可以或许自定义图像滤镜。
GPUImage 是一个基于OpenGL ES 2.0图像和视频处理惩罚的开源iOS框架,提供各种各样的图像处理惩罚滤镜,并且支持照相机和摄像机的及时滤镜,内置120多种滤镜效果,并且可以或许自定义图像滤镜。
滤镜处理惩罚的原理 就是把静态图片大概视频的每一帧进行图形变更再显示出来。它的本质就是像素点的坐标和颜色厘革
###3.1 使用GPUImage处理惩罚直播过程中美颜流程收罗视频 => 获取每一帧图片 => 滤镜处理惩罚 => GPUImageView展示 ###3.2 处理惩罚画面原理GPUImage接纳链式方式来处理惩罚画面,通过addTarget:方法为链条添加每个环节的对象,处理惩罚完一个target,就会把上一个环节处理惩罚好的图像数据通报下一个target行止理,称为GPUImage处理惩罚链。一般的target可以分为两类:中心环节的target,一般是指各种filter,是GPUImageFilter大概是子类 最终环节的target,GPUImageView 用于显示到屏幕上大概GPUImageMovieWriter写成视频文件。
主要分为三个环节:source(视频,图片源) => filter(滤镜) => final target(处理惩罚后的视频、图片) ###3.3 美颜原理磨皮(GPUImageBilateralFilter):本质就是让像素点含糊,可以使用高斯含糊,但是大概导致边沿会不清晰,用双边滤波(Bilateral Filter) ,有针对性的含糊像素点,能保证边沿不被含糊。 美白(GPUImageBrightnessFilter):本质就是提高亮度。
###3.4 GPUImage源对象GPUImage的数据源只能是4类: GPUImageVideoCamera ios摄像头的及时美颜。GPUImageVideoCamera是GPUImageOutput的子类,提供来自摄像头的图像数据作为源数据,一般是响应链的源头。
GPUImageStillCamera 相机照相
GPUImagePicture 处理惩罚静止图像
GPUImageMovie 电影
###3.5 用法 创建过滤器 创建源对象 把过滤器添加到源对象 生成target
静态图片处理惩罚: UIImage *inputImage = [UIImage imageNamed:@"105"];// 创建过滤器GPUImageBrightnessFilter *filter = [[GPUImageBrightnessFilter alloc] init];filter.brightness = 0.5;[filter forceProcessingAtSize:inputImage.size];[filter useNextFrameForImageCapture]; // 告诉系统从后来捕获过滤器// 处理惩罚静止的图像GPUImagePicture *stillPic = [[GPUImagePicture alloc] initWithImage:inputImage];[stillPic addTarget:filter]; //添加过滤器[stillPic processImage]; // 实行渲染UIImage *newImage = [filter imageFromCurrentFramebuffer];UIImageView *imageView = [[UIImageView alloc] initWithImage:newImage];[imageView sizeToFit];[self.view addSubview:imageView];imageView.center = CGPointMake(CGRectGetWidth(self.view.frame)/2, CGRectGetHeight(self.view.frame)/2); 及时美颜处理惩罚: // 创建视频源GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPresetHigh cameraPosition:AVCaptureDevicePositionBack];// 设置方向videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;// 创建预览ViewGPUImageView *videoPreview = [[GPUImageView alloc] initWithFrame:self.view.bounds];[self.view insertSubview:videoPreview atIndex:0];// 添加预览图层到源GPUImageBeautifyFilter *fiter = [[GPUImageBeautifyFilter alloc] init];[_videoCamera addTarget:fiter];[fiter addTarget:self.videoPreview];// 开始收罗视频[videoCamera startCameraCapture]; 到这里,仅仅是屏幕显示的内容有滤镜效果,而作为直播应用,还需要输出带有美颜效果的视频流。我们需要使用GPUImageMovieWriter类,才能处理惩罚视频流。 焦点思路: 通过GPUImageVideoCamera收罗视频和音频信息,音频信息直接发送给GPUImageMovieWriter,视频信息传入响应链作为源头,渲染后的视频再写入GPUImageMovieWriter,同时通过GPUImageView显示在屏幕上。只需要addTarget就可以添加GPUImageMovieWriter; ###3.6 实例代码在这里美颜的使用 ##4. 音视频编码,解码这一章太难了,以后再写。 VideoToolBox AudioToolBox ##5. 流媒体服务器国内外有许多好用的流媒体服务区。这里为了方便搭建我们接纳nginx+RTMP搭建流媒体服务器。###5.1 MAC环境搭建MACOS上搭建nginx+rtmp环境###5.2 Centos环境搭建Centos下搭建的nginx + RTMP环境###5.3 服务端常用技能CDN 直播数据上传到服务器后,观看直播的人比较多,服务器是承受不了的,会将数据分发到CDN,观众直接去CDN获取数据。减少服务器的负载。 负载平衡 由多台服务器构成一个服务器集群,每次请求的时间,会根据服务器负载选择处理惩罚请求的服务器。##6. 推流###6.1 推流协议的选择HLS和RTMP###6.2 推流原理在iOS装备上进行各推流的话,是通过AVCaptureSession这么一个捕获会话,指定两个AVCaptureDevice 也就是iOS的摄像头和麦克风,获取个原始视频和音频,然后需要进行个H.264的视频编码和AAC的音频编码,再将编码后的数据整合成一个音视频包,通过rmtp推送到nginx服务器
###6.3 librtmp这个参考资料很少。不外大部分都接纳的这个。因为涉及太多C/C++这里不讨论。 参考:https://my.oschina.net/jerikc/blog/501948 ##7. 音视频播放###7.1 播放框架的选择iOS的播放框架主要有以下三种: AVPlayer 可以播放本地、远程视频,可以自定义UI进行控制 AVPlayerViewController 自带播放控制UI,不能自定义UI MPMoviePlayerController,MPMoviePlayerViewController (iOS9后弃用)
如果只是简单的播放视频,选择AVPlayerViewController,如果想自定义播放器,选择AVPlayer。 ###7.2 AVPlayerAVPlayer是一个用来播放基于时间的流媒体控制对象。支持播放从本地、分布下载或通过HTTP Live Streaming协议得到的流媒体。AVPlayer只管理一个单独资源的播放,不外框架还提供了AVPlayer的一个子类AVQueuePlayer,可以用来管理一个资源队列。当你需要在一个序列中播放多个条目大概为音频、视频资源设置播放循环时可以使用该子类。 AVPlayer视频播放使用步骤: 创建视频资源地址URL,可以是网络URL 通过URL创建视频内容对象AVPlayerItem,一个视频对应一个AVPlayerItem 创建AVPlayer视频播放对象,需要一个AVPlayerItem进行初始化 创建AVPlayerLayer播放图层对象,添加到实际视图上去 添加KVO监听。 监听到AVPlayerItemStatusReadyToPlay的时间调用play方法
AVPlayer的使用###7.3 AVPlayerViewControllerAVPlayerViewController属于AV Kit,它是UIViewController的子类,用于展示并控制AVPlayer实例的播放。 AVPlayerViewController类使用步骤
创建URL 创建AVPlayerViewController,并根据URL设置player属性 调用play方法
AVPlayerViewController的使用 Xcode8模拟器大概有题目,打开播放不了。###8.开源框架前面所讲都有第三方框架支持。收罗、美颜、推流有LFLiveKit, 拉流播放有IJKMediaFramework。 LFLiveKit : LFLiveKit是iOS版开源RTMP流SDK。他支持背景录制、美颜功能、支持h264、AAC硬编码,动态改变速率,RTMP传输等
IJKMediaFramework : ijkplayer是B站开源的一款视频直播框架,它是基于ffmpeg。 如果从github下载是需要编译。参考地址:http://www.jianshu.com/p/1f06b27b3ac0
个人实行只需要设置Nginx+RTMP服务这里我接纳这两个第三方框架写了一个直播,包罗在线观看直播,和直播推流,支持在线美颜,前后摄像头切换等你需要: 来源:https://www.toutiao.com/article/6521180681236644355 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |