CNLiveStreamingViewController.m 9.23 KB
//
//  CNLiveStreamingViewController.m
//  QNLiveStreamingDemo
//
//  Created by iOS on 16/12/29.
//  Copyright © 2016年 zhulin. All rights reserved.
//

#import "CNLiveStreamingViewController.h"
#import "FunctionView.h"

@interface CNLiveStreamingViewController ()<CNLiveStreamingKitDelagate>
{
    UIView *_captureView;

}

@property (nonatomic, strong) CNLiveStreamingKit *kit;
@property (nonatomic, strong) FunctionView *functionView;
@property (nonatomic, strong) UISlider *zoomSlider;
@property (nonatomic, strong) UIView *reloadView;       //重试view
@property (nonatomic, strong) UIButton *reloadBtn;      //重试
@end

@implementation CNLiveStreamingViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];

    PLVideoCaptureConfiguration *videoCaptureCfg = [[PLVideoCaptureConfiguration alloc]
                                                    initWithVideoFrameRate:24 sessionPreset:AVCaptureSessionPresetHigh
                                                    previewMirrorFrontFacing:YES
                                                    previewMirrorRearFacing:NO
                                                    streamMirrorFrontFacing:NO
                                                    streamMirrorRearFacing:NO
                                                    cameraPosition:AVCaptureDevicePositionFront
                                                    videoOrientation:AVCaptureVideoOrientationPortrait];
    
    PLAudioCaptureConfiguration *audioCaptureCfg = [PLAudioCaptureConfiguration defaultConfiguration];
    
    PLVideoStreamingConfiguration *videoStreamCfg = [[PLVideoStreamingConfiguration alloc]
                                                     initWithVideoSize:CGSizeMake(368, 640)
                                                     expectedSourceVideoFrameRate:24
                                                     videoMaxKeyframeInterval:72
                                                     averageVideoBitRate:768*1024
                                                     videoProfileLevel:AVVideoProfileLevelH264HighAutoLevel
                                                     videoEncoderType:PLH264EncoderType_VideoToolbox];
    
    PLAudioStreamingConfiguration *audioStreamCfg = [PLAudioStreamingConfiguration defaultConfiguration];
    
    NSString *activityId = [NSString stringWithFormat:@"%d%d%d%d%d",arc4random()%9,arc4random()%9,arc4random()%9,arc4random()%9,arc4random()%9];

    _kit = [[CNLiveStreamingKit alloc] initWithVideoCaptureConfiguration:videoCaptureCfg
                                               audioCaptureConfiguration:audioCaptureCfg
                                             videoStreamingConfiguration:videoStreamCfg
                                             audioStreamingConfiguration:audioStreamCfg
                                                              activityId:activityId
                                                               channelId:@"test001"
                                                      isHorizontalScreen:@"0"];
    
    _kit.previewView.frame = self.view.bounds;
    _kit.delegate = self;
    _kit.streamMirrorFrontFacing = YES;
    _captureView = _kit.previewView;
    [_kit setWaterMarkWithImage:[UIImage imageNamed:@"watermark"] position:CGPointMake(30, 50)];

    [self.view addSubview:self.kit.previewView];
    [self.view addSubview:self.functionView];
    [self.view addSubview:self.zoomSlider];
    [self.view addSubview:self.reloadView];
    [self.reloadView addSubview:self.reloadBtn];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    [_kit destroy];
}

#pragma mark -
#pragma mark - action
- (void)startBtnAction:(UIButton *)button
{
    button.selected = !button.selected;
    _reloadView.hidden = YES;

    if (button.selected) {
        
        [_kit startStreamingWithFeedback:^(PLStreamStartStateFeedback feedback) {
            
            NSLog(@"start ---- %lu",(unsigned long)feedback);
            
        } failure:^(NSDictionary *errorDic) {
            
            NSLog(@"start error ---- %@",errorDic);
            _functionView.startBtn.selected = NO;
            _reloadView.hidden = NO;

        }];
        
    } else {
        
        [_kit stopStreaming];
        
    }
}

- (void)cameraBtnAction:(UIButton *)button
{
    [_kit toggleCamera];
    _zoomSlider.minimumValue = 1.0;
    _zoomSlider.maximumValue = MIN(5, self.kit.cnVideoActiveFormat.videoMaxZoomFactor);
}

- (void)flashBtnAction:(UIButton *)button
{
    button.selected = !button.selected;
    _kit.torchOn = button.selected;
}

- (void)beautyBtnAction:(UIButton *)button
{
    button.selected = !button.selected;
    [_kit setBeautifyModeOn:button.selected];
}

- (void)closeBtnAction:(UIButton *)button
{
    [_kit stopStreaming];
    [self dismissViewControllerAnimated:YES completion:NULL];
}

- (void)scrollSlider:(UISlider *)slider {
    _kit.videoZoomFactor = slider.value;
}

- (void)reloadAction
{
    _reloadView.hidden = YES;

    [_kit startStreamingWithFeedback:^(PLStreamStartStateFeedback feedback) {
        
        NSLog(@"start ---- %lu",(unsigned long)feedback);
        
    } failure:^(NSDictionary *errorDic) {
        
        NSLog(@"start error ---- %@",errorDic);
        _functionView.startBtn.selected = NO;
        _reloadView.hidden = NO;

    }];
}

#pragma mark -
#pragma mark - CNLiveStreamingKitDelagate
- (void)streamStateDidChange:(PLStreamState)state
{
    NSLog(@"streamStateDidChange ------>>>>> %lu",(unsigned long)state);
    if (state != PLStreamStateConnected) {
        _functionView.startBtn.selected = NO;
    } else {
        _functionView.startBtn.selected = YES;
    }
}

- (void)didDisconnectWithError:(NSDictionary *)errorDic
{
    NSLog(@"didDisconnectWithError ------>>>>> %@",errorDic[@"errorMessage"]);
    _reloadView.hidden = NO;
}

- (void)streamStatusDidUpdate:(PLStreamStatus *)status
{
    NSLog(@"streamStatusDidUpdate ------>>>>> %@",status);
}

#pragma mark -
#pragma mark - getter
- (FunctionView *)functionView
{
    if (!_functionView) {
        _functionView = [[FunctionView alloc] initWithFrame:CGRectMake(0, kSCREEN_HEIGHT-60, kSCREEN_WIDTH, 40)];
        [_functionView.startBtn addTarget:self action:@selector(startBtnAction:) forControlEvents:UIControlEventTouchUpInside];
        [_functionView.cameraBtn addTarget:self action:@selector(cameraBtnAction:) forControlEvents:UIControlEventTouchUpInside];
        [_functionView.flashBtn addTarget:self action:@selector(flashBtnAction:) forControlEvents:UIControlEventTouchUpInside];
        [_functionView.beautyBtn addTarget:self action:@selector(beautyBtnAction:) forControlEvents:UIControlEventTouchUpInside];
        [_functionView.closeBtn addTarget:self action:@selector(closeBtnAction:) forControlEvents:UIControlEventTouchUpInside];
    }
    return _functionView;
}

- (UISlider *)zoomSlider
{
    if (!_zoomSlider) {
        _zoomSlider = [[UISlider alloc] initWithFrame:CGRectMake(20, 80, kSCREEN_WIDTH-40, 30)];
        [_zoomSlider setThumbImage:[UIImage imageNamed:@"btn_dot"] forState:UIControlStateNormal];
        [_zoomSlider setMaximumTrackTintColor:[UIColor whiteColor]];
        [_zoomSlider setMinimumTrackTintColor:[UIColor redColor]];
        _zoomSlider.value = 1.0;
        _zoomSlider.minimumValue = 1.0;
        _zoomSlider.maximumValue = MIN(5, _kit.cnVideoActiveFormat.videoMaxZoomFactor);
        [_zoomSlider addTarget:self action:@selector(scrollSlider:) forControlEvents:UIControlEventValueChanged];
    }
    return _zoomSlider;
}

- (UIButton *)reloadBtn
{
    if (!_reloadBtn) {
        _reloadBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        _reloadBtn.frame = CGRectMake(35, 50, 110, 40);
        [_reloadBtn setTitle:@"点击重试" forState:UIControlStateNormal];
        [_reloadBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        _reloadBtn.titleLabel.font = [UIFont systemFontOfSize:18];
        _reloadBtn.layer.cornerRadius = 10;
        _reloadBtn.layer.masksToBounds = YES;
        _reloadBtn.layer.borderColor = [UIColor whiteColor].CGColor;
        _reloadBtn.layer.borderWidth = 1.5;
        [_reloadBtn addTarget:self action:@selector(reloadAction) forControlEvents:UIControlEventTouchUpInside];
    }
    return _reloadBtn;
}
- (UIView *)reloadView
{
    if (!_reloadView) {
        _reloadView = [[UIView alloc] initWithFrame:CGRectMake((kSCREEN_WIDTH-180)/2, (kSCREEN_HEIGHT-120)/2, 180, 120)];
        _reloadView.hidden = YES;
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 180, 30)];
        label.textColor = [UIColor whiteColor];
        label.font = [UIFont systemFontOfSize:19];
        label.text = @"抱歉,直播出错了~";
        label.textAlignment = NSTextAlignmentCenter;
        [self.reloadView addSubview:label];
    }
    return _reloadView;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end