標籤:
推流用的是一個第三方的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;}
至此,完成了推流工作。
iOS簡單直播實現(二:推流)