iOS简单直播实现(二:推流)

来源:互联网 发布:阿里云 域名解析到网址 编辑:程序博客网 时间:2024/04/30 20:58

 推流用的是一个第三方的IFLiveKit框架。这个框架基于rtmp协议的,c语言和oc语言分开的非常清楚,对oc语言非常友好,使用起来相对简单。

  IFLiveKit内部集成了GPUIImage。内部实现了图片渲染等美艳效果。减少了开发时候美艳效果的调试。

  需求:创建一个简单的推流页面。包含功能有:1.推流状态监听。2.切换摄像头。3.切换美艳效果。4.开关推流。

一.推流之前需要检查摄像头和麦克风等权限是否开启,并启动摄像头,核心代码如下:

复制代码
//判断是否有摄像头    if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){        [self showInfo:@"您的设备没有摄像头或者相关的驱动, 不能进行直播"];        return;    }    //判断是否有摄像头权限    AVAuthorizationStatus  authorizationStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];    if (authorizationStatus == AVAuthorizationStatusRestricted|| authorizationStatus == AVAuthorizationStatusDenied) {        [self showInfo:@"app需要访问您的摄像头。\n请启用摄像头-设置/隐私/摄像头"];        return ;    }    AVAudioSession *audioSession = [AVAudioSession sharedInstance];    if ([audioSession respondsToSelector:@selector(requestRecordPermission:)]) {        [audioSession performSelector:@selector(requestRecordPermission:) withObject:^(BOOL granted) {            if (granted) {                return YES;            }            else {                [self showInfo:@"app需要访问您的麦克风。\n请启用麦克风-设置/隐私/麦克风"];                return NO;            }        }];    }
复制代码

二.创建一个按钮.点击开始推流代码如下:

复制代码
- (LFLiveSession*)session{    if(!_session){        /***   默认分辨率368 * 640  音频:44.1 iphone6以上48  双声道  方向竖屏 ***/        _session = [[LFLiveSession alloc] initWithAudioConfiguration:[LFLiveAudioConfiguration defaultConfiguration] videoConfiguration:[LFLiveVideoConfiguration defaultConfigurationForQuality:LFLiveVideoQuality_Medium2]];                /**    自己定制高质量音频128K 分辨率设置为720*1280 方向竖屏 */        /*         LFLiveAudioConfiguration *audioConfiguration = [LFLiveAudioConfiguration new];         audioConfiguration.numberOfChannels = 2;         audioConfiguration.audioBitrate = LFLiveAudioBitRate_128Kbps;         audioConfiguration.audioSampleRate = LFLiveAudioSampleRate_44100Hz;                  LFLiveVideoConfiguration *videoConfiguration = [LFLiveVideoConfiguration new];         videoConfiguration.videoSize = CGSizeMake(720, 1280);         videoConfiguration.videoBitRate = 800*1024;         videoConfiguration.videoMaxBitRate = 1000*1024;         videoConfiguration.videoMinBitRate = 500*1024;         videoConfiguration.videoFrameRate = 15;         videoConfiguration.videoMaxKeyframeInterval = 30;         videoConfiguration.orientation = UIInterfaceOrientationPortrait;         videoConfiguration.sessionPreset = LFCaptureSessionPreset720x1280;                  _session = [[LFLiveSession alloc] initWithAudioConfiguration:audioConfiguration videoConfiguration:videoConfiguration liveType:LFLiveRTMP];         */                // 设置代理        _session.delegate = self;        _session.running = YES;        _session.preView = self.livingPreView;    }    return _session;}- (IBAction)startTouched:(id)sender {    LFLiveStreamInfo *stream = [LFLiveStreamInfo new];    // 本地推流地址    stream.url = @"rtmp://192.168.199.131:1935/rtmplive/room";    self.rtmpUrl = stream.url;    [self.session startLive:stream];}
复制代码

3.创建一个按钮点击关闭推流,代码如下

- (IBAction)endTouched:(id)sender {    // 结束直播    [self.session stopLive];    self.stateLable.text = [NSString stringWithFormat:@"状态: 直播被关闭\nRTMP: %@", self.rtmpUrl];}

4.创建一个按钮点击切换前后摄像头,代码如下

- (IBAction)camaBtnTouched:(id)sender {    AVCaptureDevicePosition devicePositon = self.session.captureDevicePosition;    self.session.captureDevicePosition = (devicePositon == AVCaptureDevicePositionBack) ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;    NSLog(@"切换前置/后置摄像头");}

5.创建一个按钮设置美艳功能,代码如下

- (IBAction)beautiyBtnTouched:(id)sender {    ((UIButton*)sender).selected = !((UIButton*)sender).selected;    // 默认是开启了美颜功能的    self.session.beautyFace = !self.session.beautyFace;}

6.推流状态监听,接受代理,代码如下:

复制代码
#pragma mark -- LFStreamingSessionDelegate/** live status changed will callback */- (void)liveSession:(nullable LFLiveSession *)session liveStateDidChange:(LFLiveState)state{    NSString *tempStatus;    switch (state) {        case LFLiveReady:            tempStatus = @"准备中";            break;        case LFLivePending:            tempStatus = @"连接中";            break;        case LFLiveStart:            tempStatus = @"已连接";            break;        case LFLiveStop:            tempStatus = @"已断开";            break;        case LFLiveError:            tempStatus = @"连接出错";            break;        default:            break;    }    self.stateLable.text = [NSString stringWithFormat:@"状态: %@\nRTMP: %@", tempStatus, self.rtmpUrl];}/** live debug info callback */- (void)liveSession:(nullable LFLiveSession *)session debugInfo:(nullable LFLiveDebug*)debugInfo{    }/** callback socket errorcode */- (void)liveSession:(nullable LFLiveSession*)session errorCode:(LFLiveSocketErrorCode)errorCode{    }
复制代码

6.自己也需要看到自己的推流画面,并观察美艳效果,代码如下:

复制代码
- (UIView *)livingPreView{    if (!_livingPreView) {        UIView *livingPreView = [[UIView alloc] initWithFrame:self.view.bounds];        livingPreView.backgroundColor = [UIColor clearColor];        livingPreView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;        [self.view insertSubview:livingPreView atIndex:0];        _livingPreView = livingPreView;    }    return _livingPreView;}
复制代码

至此,完成了推流工作。

0 0
原创粉丝点击