iOS簡單直播實現(二:推流)


  推流用的是一個第三方的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;
}

至此,完成了推流工作。

-----------------------------分割線-------------------------------------

 

  新手上路,共同進步群號:240970537


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM