您的位置:时时app平台注册网站 > 编程知识 > 直播类app中拉流工夫的落到实处[转]

直播类app中拉流工夫的落到实处[转]

2019-09-19 06:45
- requestAccessForVideo { __weak typeof _self = self; AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; switch  { case AVAuthorizationStatusNotDetermined: { // 许可对话没有出现,发起授权许可 [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { if  { dispatch_async(dispatch_get_main_queue(), ^{ [_self.session setRunning:YES]; }); } }]; break; } case AVAuthorizationStatusAuthorized: { // 已经开启授权,可继续 dispatch_async(dispatch_get_main_queue(), ^{ [_self.session setRunning:YES]; }); break; } case AVAuthorizationStatusDenied: case AVAuthorizationStatusRestricted: // 用户明确地拒绝授权,或者相机设备无法访问 break; default: break; }}

- requestAccessForAudio { AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]; switch  { case AVAuthorizationStatusNotDetermined: { [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) { }]; break; } case AVAuthorizationStatusAuthorized: { break; } case AVAuthorizationStatusDenied: case AVAuthorizationStatusRestricted: break; default: break; }}
- startLive { LFLiveStreamInfo *stream = [LFLiveStreamInfo new]; //这是直播的网址,直接复制LFLiveKit提供的这个地址 stream.url = @"rtmp://live.hkstv.hk.lxdns.com:1935/live/stream153"; [self.session startLive:stream];}- startLive:(LFLiveStreamInfo *)streamInfo { if (!streamInfo) return; _streamInfo = streamInfo; _streamInfo.videoConfiguration = _videoConfiguration; _streamInfo.audioConfiguration = _audioConfiguration; [self.socket start];}

nginx rtmp ffmpeg:在地面搭建服务器,免去开展第三方直播的流量花费。未来大家的档案的次序中合拢了推流的所用的LFLiveKit,播放所需的ijkplayer,便可用手提式有线电话机做推流直播,模拟器做拉流播放。

- liveSession:(nullable LFLiveSession *)session liveStateDidChange:(LFLiveState)state { NSLog(@"liveStateDidChange: %ld", state); switch  { case LFLiveReady: _stateLabel.text = @"未连接"; break; case LFLivePending: _stateLabel.text = @"连接中"; break; case LFLiveStart: _stateLabel.text = @"已连接"; break; case LFLiveError: _stateLabel.text = @"连接错误"; break; case LFLiveStop: _stateLabel.text = @"未连接"; break; default: break; }}
- liveSession:(nullable LFLiveSession *)session liveStateDidChange:(LFLiveState)state { NSLog(@"liveStateDidChange: %ld", state); switch  { case LFLiveReady: _stateLabel.text = @"未连接"; break; case LFLivePending: _stateLabel.text = @"连接中"; break; case LFLiveStart: _stateLabel.text = @"已连接"; break; case LFLiveError: _stateLabel.text = @"连接错误"; break; case LFLiveStop: _stateLabel.text = @"未连接"; break; default: break; }}

需设置 General>Deployment Info> Deployment Target 为8.0

外表直播调节器分界面调用格局

脱离直播

nginx -v 查看版本号后再实施

- startLive:sender { UIView * back = [[UIView alloc] initWithFrame:self.view.bounds]; back.backgroundColor = [UIColor blackColor]; [self.view addSubview:back]; LFLivePreview * liveView = [[LFLivePreview alloc] initWithFrame:self.view.bounds withController:self]; [self.view addSubview:liveView]; [liveView startLive];}
- cameraBtnClick:(UIButton *)btn{ AVCaptureDevicePosition devicePositon = self.session.captureDevicePosition; self.session.captureDevicePosition = (devicePositon == AVCaptureDevicePositionBack) ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;}

新建项目名字为LXPlayerLive,将Podfile里填写为

开创二个卫冕与UIView的LFLivePreview类,在LFLivePreview.h文件中对外提供多少个措施,开始拉直播和停业直播方法。

表面直播调节器分界面调用格局

将LFLivePreview、UIControl YYAdd、UIView Add那四个类的.h与.m文件拖入项目中,运转精确后做如下修改1)改为竖屏直播,配置如下图

美颜功用

接下去看看如何将LFLive基特承接到我们团结的门类中去。首先在podfile文件中增添pod ‘LFLiveKit’ ,然后 pod install。接下来就能够直接开头代码部分了。

开荒VLC,然后点击工具栏File - Open Network... ,然后输入的U凯雷德L是LFLivePreview.m文件里stream.url值如下:

退出直播

起来直播

在意:须将“LFLive基Ted姆o”的国语引号改为葡萄牙共和国语引号。同期删掉, :path => '../.'

千帆竞发直播

@interface LFLivePreview : UIView- startLive;- stopLive;@end

2)再一次运营代码会有报错,修改后如下

- closeBtnClick:(UIButton *)btn{ [self stopLive]; [self.controller dismissViewControllerAnimated:YES completion:nil];}

停下直播

 _videoCamera.outputImageOrientation = statusBar;// if (statusBar != UIInterfaceOrientationPortrait && statusBar != UIInterfaceOrientationPortraitUpsideDown) {// @throw [NSException exceptionWithName:@"当前设置方向出错" reason:@"LFLiveVideoConfiguration landscape error" userInfo:nil];// } else {// }
- beautyBtnClick:(UIButton *)btn{ self.session.beautyFace = !self.session.beautyFace; self.beautyButton.selected = !self.session.beautyFace;}
- stopLive { [self.session stopLive];}- stopLive { self.uploading = NO; [self.socket stop]; self.socket = nil;}

图片 1效果图.gif

原版的书文链接:

开创一个持续与UIView的LFLivePreview类,在LFLivePreview.h文件中对外提供五个点子,伊始拉直播和停业直播方法。

图片 2screen1.png

停下直播

美颜作用

brew tap homebrew/nginxbrew install nginx-full --with-rtmp-modulenginxbrew info nginx-full

画面切换

- beautyBtnClick:(UIButton *)btn{ self.session.beautyFace = !self.session.beautyFace; self.beautyButton.selected = !self.session.beautyFace;}
LFLiveStreamInfo *stream = [LFLiveStreamInfo new];stream.url = @"rtmp://live.hkstv.hk.lxdns.com:1935/live/stream153";[_self.session startLive:stream];
- stopLive { [self.session stopLive];}- stopLive { self.uploading = NO; [self.socket stop]; self.socket = nil;}

在初叶化那个view的时候首先要落实音频和录制授权操作。

图片 3screen3.png

在LFLivePreview.m文件中,首开始入头文件#import "LFLiveSession.h”,并依据LFLiveSessionDelegate合同,然后增加贰特品质@property (nonatomic, strong) LFLiveSession *session;看有的那么些天性的懒加载代码:

镜头切换

将地点的1.10.1换来你刚刚输出的版本号。

- cameraBtnClick:(UIButton *)btn{ AVCaptureDevicePosition devicePositon = self.session.captureDevicePosition; self.session.captureDevicePosition = (devicePositon == AVCaptureDevicePositionBack) ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;}
- requestAccessForVideo { __weak typeof _self = self; AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; switch  { case AVAuthorizationStatusNotDetermined: { // 许可对话没有出现,发起授权许可 [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { if  { dispatch_async(dispatch_get_main_queue(), ^{ [_self.session setRunning:YES]; }); } }]; break; } case AVAuthorizationStatusAuthorized: { // 已经开启授权,可继续 dispatch_async(dispatch_get_main_queue(), ^{ [_self.session setRunning:YES]; }); break; } case AVAuthorizationStatusDenied: case AVAuthorizationStatusRestricted: // 用户明确地拒绝授权,或者相机设备无法访问 break; default: break; }}

- requestAccessForAudio { AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio]; switch  { case AVAuthorizationStatusNotDetermined: { [AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio completionHandler:^(BOOL granted) { }]; break; } case AVAuthorizationStatusAuthorized: { break; } case AVAuthorizationStatusDenied: case AVAuthorizationStatusRestricted: break; default: break; }}

运行LXPlayerLive源码会报错,因紧缺IJKMediaFramework库,文件太大不能够上传到Github,请另外下载IJKMediaFramework依照上边的章程增添到小编的demo中。项目用了pods,所以还需实践pod install。再一次运维若是报错如下:

@interface LFLivePreview : UIView- startLive;- stopLive;@end

上面那个代理方法是监控直播状态的代理方法

键入如下命令。

- (LFLiveSession *)session { if (!_session) { /*** 默认分辨率368 * 640 音频:44.1 iphone6以上48 双声道 方向竖屏 ***/ LFLiveAudioConfiguration * audioConfiguration =[LFLiveAudioConfiguration defaultConfiguration]; LFLiveVideoConfiguration * videoConfiguration = [LFLiveVideoConfiguration defaultConfiguration]; //最新写法 _session = [[LFLiveSession alloc]initWithAudioConfiguration:audioConfiguration videoConfiguration:videoConfiguration captureType:LFLiveCaptureDefaultMask]; // _session = [[LFLiveSession alloc] initWithAudioConfiguration:audioConfiguration videoConfiguration:videoConfiguration liveType:LFLiveRTMP]; _session.delegate = self; _session.showDebugInfo = NO; _session.preView = self; } return _session;}

在LFLivePreview.m文件中,首起头入头文件#import "LFLiveSession.h”,并依据LFLiveSessionDelegate公约,然后增多叁特性能@property (nonatomic, strong) LFLiveSession *session;看一些那特性情的懒加载代码:

抓取了映客、喵播、斗鱼等的直播接口用在了此demo上的地方是github地址。

在早先化那些view的时候首先要落到实处音频和录像授权操作。

- closeBtnClick:(UIButton *)btn{ [self stopLive]; [self.controller dismissViewControllerAnimated:YES completion:nil];}

1)会有如下报错代码,将其注释

下边这一个代理方法是监督直播状态的代办方法

- (LFLiveSession *)session { if (!_session) { /*** 默认分辨率368 * 640 音频:44.1 iphone6以上48 双声道 方向竖屏 ***/ LFLiveAudioConfiguration * audioConfiguration =[LFLiveAudioConfiguration defaultConfiguration]; LFLiveVideoConfiguration * videoConfiguration = [LFLiveVideoConfiguration defaultConfiguration]; //最新写法 _session = [[LFLiveSession alloc]initWithAudioConfiguration:audioConfiguration videoConfiguration:videoConfiguration captureType:LFLiveCaptureDefaultMask]; // _session = [[LFLiveSession alloc] initWithAudioConfiguration:audioConfiguration videoConfiguration:videoConfiguration liveType:LFLiveRTMP]; _session.delegate = self; _session.showDebugInfo = NO; _session.preView = self; } return _session;}

下一场走入步入/usr/local/etc/nginx/nginx.conf文件里,在终极一行增多如下代码

- startLive { LFLiveStreamInfo *stream = [LFLiveStreamInfo new]; //这是直播的网址,直接复制LFLiveKit提供的这个地址 stream.url = @"rtmp://live.hkstv.hk.lxdns.com:1935/live/stream153"; [self.session startLive:stream];}- startLive:(LFLiveStreamInfo *)streamInfo { if (!streamInfo) return; _streamInfo = streamInfo; _streamInfo.videoConfiguration = _videoConfiguration; _streamInfo.audioConfiguration = _audioConfiguration; [self.socket start];}
- startLive:sender { UIView * back = [[UIView alloc] initWithFrame:self.view.bounds]; back.backgroundColor = [UIColor blackColor]; [self.view addSubview:back]; LFLivePreview * liveView = [[LFLivePreview alloc] initWithFrame:self.view.bounds withController:self]; [self.view addSubview:liveView]; [liveView startLive];}
videoConfiguration.videoSize = CGSizeMake;

事先说过推流的贯彻 ,未来以来一下拉流的落实。demo下载地址: 这个工程的门径,然后pod install,之后便可运营在真机上。3.开辟LFLivePreview.m文件,在那一个文件的末尾会发掘有这么一行代码: stream.url = @"rtmp://live.hkstv.hk.lxdns.com:壹玖叁伍/live/stream153”;并将这么些网址复制到浏览器中开荒,此时会自行打开VLC软件,点击playList中的网站,便可播放手提式有线话机端的拉流录制。4.要是以上步骤施行精确,就证实手提式有线电话机端的拉流录像已经打响推送到服务器上,我们透过VLC能够得到到服务器上的推流摄像。

事先说过推流的实现,以往以来一下拉流的兑现。demo下载地址: 那几个工程的路子,然后pod install,之后便可运维在真机上。3.张开LFLivePreview.m文件,在那几个文件的末尾会发掘有与此相类似一行代码: stream.url = @"rtmp://live.hkstv.hk.lxdns.com:1932/live/stream153”;并将以此网站复制到浏览器中张开,此时会自行张开VLC软件,点击playList中的网站,便可播放手提式有线电话机端的拉流录制。4.一旦以上步骤实行正确,就印证手提式有线电话机端的拉流摄像已经打响推送到服务器上,大家通过VLC可以取获得服务器上的推流录像。

3)再一次运营便可成功推流。

接下去看看如何将LFLive基特承袭到大家温馨的体系中去。首先在podfile文件中增加pod ‘LFLiveKit’ ,然后 pod install。接下来就能够直接开头代码部分了。

ijkplayer:是基于FFmpeg的跨平台播放器框架,由B站开垦。方今已被七个主流直播App集成应用。github地址:

图片 4screen7.png

  • 推流:LFLiveKit
  • 播放:ijkplayer
  • 服务器:nginx rtmp ffmpeg

此刻在终点末尾查找nginx.conf文件的岗位,如下图

各自键入如下命令

极端cd 到LFLive基Ted姆o后,再输入vim Podfile后,文件一贯自动补全如下

videoConfiguration.outputImageOrientation = UIInterfaceOrientationLandscapeLeft;videoConfiguration.autorotate = NO;
source 'https://github.com/CocoaPods/Specs.git'platform :ios,'7.0'target “LFLiveKitDemo” do pod 'LFLiveKit', :path => '../.'end
source 'https://github.com/CocoaPods/Specs.git'platform :ios,'7.0'target "LXPlayerLive" do pod 'LFLiveKit'end

实例demo中的播放分界面用的mediaControl自身感觉好丑就不应用其相关代码了,将别的代码全体复制到本身项目标播音调整器中。集成的基本代码如下:

//- (UIInterfaceOrientationMask)supportedInterfaceOrientations {// return UIInterfaceOrientationMaskLandscape;//}////- shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {// return YES;//}
cd ios./compile-ffmpeg.sh clean./compile-ffmpeg.sh all

规行矩步如上的步调便可集成好ijkplayer,不过下载ffmpeg与编译,实施脚本时间太长也麻烦,所以有大神将其集成为了叁个IJKMediaFramework.framework库,间接抬高就能够使用,免去地点步骤中的麻烦。(下载地址忘记了,有Debug与Release版本)1)注意:一定先把IJKMediaFramework.framework复制到项目文件夹中,别拖到项目中,然后在Build Phases -> Link Binary with Libraries -> Add那些职务增添IJKMediaFramework库2)依据screen4.png截图中的提示,再加多相应的10个库。

图片 5screen4.png图片 6screen5.png

继续试行如下命令

因为安装nginx rtmp ffmpeg必要Homebrew。使用命令man brew查看是不是富有Homebrew,若未有机关再百度安装就能够,小编的出于事先装过ReactNative的条件亟待Homebrew,因而会提醒三个拉拉扯扯新闻,然后输入Q就可以退出。

请留意那是LFLiveKit的公用服务器地址,外人也能够拉流获取看到你的直播。将要终极介绍在和睦Computer中搭建本人的服务器,再也固然被人家偷看了。

LFLiveKit:框架辅助RTMP,由Adobe公司支付。github地址

可将项目中所用的推流与拉流的U安德拉L由rtmp://live.hkstv.hk.lxdns.com:一九三一/live/stream153换来rtmp://192.168.15.122:一九三三/rtmplive/room。注意:1.将192.168.15.122换来自身计算机的ip地址,端口号1932别改。2.亟须有限援助推流与拉流的设施与此Computer使用的是同二个局域网。

/usr/local/Cellar/nginx-full/1.10.1/bin/nginx -s reload
rtmp { server { listen 1935; application rtmplive { live on; record off; } }}
brew install ffmpeg

这里的self.url一时半刻还采纳LFLiveKit的开垦者提供的无需付费公用直播推流服务器地址(在播报时经常见到别的技师的直播,偷笑)。

有了那三点本领就足以成功三个差不离的直播系统。效果图如下(左侧的是用模拟器设备运行播放的,中间的是用VLC播放器播放的,当前在用手机推流直播)。

LFLiveKitCurry已经集成GPUImage框架用于美颜功用,GPUImage基于OpenGl开辟,纯OC语言框架,封装好了种种滤镜同期也能够编写自定义的滤镜,其本人内置了多达125种常见的滤镜效果。

3)修改LFLivePreview.m的附和代码videoSize的值为

 [IJKFFMoviePlayerController checkIfFFmpegVersionMatch:YES]; // [IJKFFMoviePlayerController checkIfPlayerVersionMatch:YES major:1 minor:0 micro:0]; IJKFFOptions *options = [IJKFFOptions optionsByDefault]; self.player = [[IJKFFMoviePlayerController alloc] initWithContentURL:self.url withOptions:options]; self.player.view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; self.player.view.frame = self.view.bounds; self.player.scalingMode = IJKMPMovieScalingModeAspectFit; self.player.shouldAutoplay = YES; self.view.autoresizesSubviews = YES; [self.view addSubview:self.player.view];

本文首要分享怎么样运用第三方框架的阅历,从源码到集成,没作代码深入分析。一个一体化的直播系统要求涉及到的本领主要不外乎以下方面:1.搜罗、2.滤镜管理、3.编码、4.推流、5.CDN分发、6.拉流、7.解码、8.播放、9.闲话互动。在那之中1~4由LFLiveKit达成(2由GPUImage实现),5正是搭建的地头服务器,6~8由ijkplayer达成。

图片 7screen6.png

事业有成后找到拉流的关键代码用于和睦项目并入。在app分界面上点击Online Samples,再点击大肆二个cell就可以播放。进而在demo中可追踪到IJKMoviePlayerViewController类,正是播放的类。

2)注释掉ViewController.m里的代码

本文由时时app平台注册网站发布于编程知识,转载请注明出处:直播类app中拉流工夫的落到实处[转]

关键词: