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

來源:互聯網
上載者:User

標籤:

  推流用的是一個第三方的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簡單直播實現(二:推流)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.