Commit 7b964133f99cb6315840d3461f91f28b59ae7d56
1 parent
0a30c700
添加消息ID
Showing
1 changed file
with
144 additions
and
26 deletions
LiveVideoCloud/LiveVideoCloud/Classes/Sections/LiveSections/Controller/LVCLiveViewController.m
| ... | ... | @@ -28,8 +28,8 @@ |
| 28 | 28 | |
| 29 | 29 | @implementation LVCLiveViewController |
| 30 | 30 | |
| 31 | -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation | |
| 32 | -{ | |
| 31 | +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { | |
| 32 | + | |
| 33 | 33 | if (_kitCN) { |
| 34 | 34 | return UIInterfaceOrientationMaskAllButUpsideDown; |
| 35 | 35 | } else { |
| ... | ... | @@ -49,9 +49,11 @@ |
| 49 | 49 | |
| 50 | 50 | - (void)viewDidLoad { |
| 51 | 51 | [super viewDidLoad]; |
| 52 | - // Do any additional setup after loading the view. | |
| 52 | + | |
| 53 | 53 | self.view.backgroundColor = [UIColor blueColor]; |
| 54 | 54 | |
| 55 | + [self.view addSubview:self.captureView]; | |
| 56 | + | |
| 55 | 57 | UIButton *closeBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH - 50, 30, 50, 30)]; |
| 56 | 58 | [closeBtn setTitle:@"关闭" forState:UIControlStateNormal]; |
| 57 | 59 | [closeBtn addTarget:self action:@selector(closeBtnClivk) forControlEvents:UIControlEventTouchUpInside]; |
| ... | ... | @@ -69,6 +71,23 @@ |
| 69 | 71 | |
| 70 | 72 | [self setStreamerCfg]; |
| 71 | 73 | [self addObservers]; |
| 74 | + | |
| 75 | + _startLiveBtn = [self addButton:@"开始直播" frame:CGRectMake(100, 40, 80, 40) action:@selector(startCapture:)]; | |
| 76 | + [_startLiveBtn setTitle:@"开始直播" forState:UIControlStateNormal]; | |
| 77 | + [_startLiveBtn setTitle:@"停止直播" forState:UIControlStateSelected]; | |
| 78 | + | |
| 79 | + [self addButton:@"关闭预览" frame:CGRectMake(10, 40, 80, 40) action:@selector(startPreview:)]; | |
| 80 | + [self addButton:@"退出" frame:CGRectMake(190, 40, 80, 40) action:@selector(quit)]; | |
| 81 | + [self addButton:@"美颜" frame:CGRectMake(10, 100, 80, 40) action:@selector(openFilter:)]; | |
| 82 | + [self addButton:@"摄像头" frame:CGRectMake(100, 100, 80, 40) action:@selector(changeCamera:)]; | |
| 83 | + [self addButton:@"闪光灯" frame:CGRectMake(190, 100, 80, 40) action:@selector(openFlash)]; | |
| 84 | + | |
| 85 | + UITapGestureRecognizer * singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)]; | |
| 86 | + singleRecognizer.delegate = self; | |
| 87 | + [self.captureView addGestureRecognizer:singleRecognizer]; | |
| 88 | + | |
| 89 | + UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchDetected:)]; | |
| 90 | + [self.view addGestureRecognizer:pinch]; | |
| 72 | 91 | } |
| 73 | 92 | |
| 74 | 93 | #pragma mark - initialization Streamer |
| ... | ... | @@ -114,46 +133,102 @@ |
| 114 | 133 | |
| 115 | 134 | } |
| 116 | 135 | |
| 117 | -#pragma mark - Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
| 118 | - | |
| 119 | -- (void)addObservers { | |
| 136 | +#pragma mark - GetMethod !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
| 137 | +// 拍摄视图 | |
| 138 | +- (UIView *)captureView { | |
| 120 | 139 | |
| 121 | - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(captureStateChange) name:CNLiveCaptureStateDidChangeNotification object:nil]; | |
| 122 | - | |
| 123 | - [[NSNotificationCenter defaultCenter] addObserver:self | |
| 124 | - selector:@selector(streamStateChange) | |
| 125 | - name:CNLiveStreamStateDidChangeNotification | |
| 126 | - object:nil]; | |
| 140 | + if (!_captureView) { | |
| 141 | + _captureView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; | |
| 142 | + _captureView.backgroundColor = [UIColor blackColor]; | |
| 143 | + } | |
| 144 | + return _captureView; | |
| 145 | +} | |
| 146 | + | |
| 147 | + | |
| 148 | +#pragma mark - UIButton Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
| 149 | + | |
| 150 | +// 开始推流 | |
| 151 | +- (void)startCapture:(UIButton *)button { | |
| 127 | 152 | |
| 128 | - [[NSNotificationCenter defaultCenter] addObserver:self | |
| 129 | - selector:@selector(enterBg) | |
| 130 | - name:UIApplicationDidEnterBackgroundNotification | |
| 131 | - object:nil]; | |
| 153 | + button.selected = !button.selected; | |
| 132 | 154 | |
| 133 | - [[NSNotificationCenter defaultCenter] addObserver:self | |
| 134 | - selector:@selector(becameActive) | |
| 135 | - name:UIApplicationDidBecomeActiveNotification | |
| 136 | - object:nil]; | |
| 155 | + if (button.selected) { | |
| 156 | + [_kitCN startStream:^{ | |
| 157 | + NSLog(@"开启推流成功 ------- success"); | |
| 158 | + } failure:^(NSDictionary *errorDic) { | |
| 159 | + [self toast:errorDic[@"errorMessage"]]; | |
| 160 | + _startLiveBtn.selected = NO; | |
| 161 | + }]; | |
| 162 | + }else{ | |
| 163 | +// _stateLab.text = nil; | |
| 164 | + [_kitCN stopStream]; | |
| 165 | + } | |
| 166 | +} | |
| 167 | + | |
| 168 | +// 开始 / 关闭 预览 | |
| 169 | +- (void)startPreview:(UIButton *)button { | |
| 170 | + | |
| 171 | + button.selected = !button.selected; | |
| 172 | + if (button.selected) { | |
| 173 | + _startLiveBtn.enabled = NO; | |
| 174 | + [button setTitle:@"开启预览" forState:UIControlStateNormal]; | |
| 175 | + if (_kitCN.streamState == CNLiveStreamStateConnected) { | |
| 176 | + [_kitCN stopStream]; | |
| 177 | + _startLiveBtn.selected = NO; | |
| 178 | + } | |
| 179 | + [_kitCN stopPreview]; | |
| 180 | + }else{ | |
| 181 | + [_kitCN startPreview:self.captureView]; | |
| 182 | + [button setTitle:@"关闭预览" forState:UIControlStateNormal]; | |
| 183 | + _startLiveBtn.enabled = YES; | |
| 184 | + } | |
| 137 | 185 | } |
| 138 | 186 | |
| 139 | 187 | // 退出 |
| 140 | 188 | - (void)closeBtnClivk { |
| 141 | 189 | |
| 190 | + if (_kitCN.streamState == CNLiveStreamStateConnected) { | |
| 191 | + [_kitCN stopStream]; | |
| 192 | + } | |
| 193 | + if (_kitCN.captureState == CNLiveCaptureStateCapturing) { | |
| 194 | + [_kitCN stopPreview]; | |
| 195 | + } | |
| 196 | + | |
| 142 | 197 | [self dismissViewControllerAnimated:YES completion:nil]; |
| 143 | 198 | } |
| 144 | 199 | |
| 145 | -#pragma mark - notification | |
| 146 | 200 | |
| 201 | +#pragma mark - UIGestureRecognizer Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
| 202 | +//对焦与曝光 | |
| 203 | +- (void)onTap:(UIGestureRecognizer *)sender | |
| 204 | +{ | |
| 205 | + CGPoint current = [sender locationInView:self.view]; | |
| 206 | + CGPoint point = [self convertToPointOfInterestFromViewCoordinates:current]; | |
| 207 | + [_kitCN exposureAtPoint:point]; | |
| 208 | + [_kitCN focusAtPoint:point]; | |
| 209 | +} | |
| 210 | + | |
| 211 | +//缩放 | |
| 212 | +- (void)pinchDetected:(UIPinchGestureRecognizer *)recognizer{ | |
| 213 | + if (recognizer.state == UIGestureRecognizerStateBegan) { | |
| 214 | + _currentPinchZoomFactor = _kitCN.pinchZoomFactor; | |
| 215 | + } | |
| 216 | + CGFloat zoomFactor = _currentPinchZoomFactor * recognizer.scale;//当前触摸缩放因子*坐标比例 | |
| 217 | + [_kitCN setPinchZoomFactor:zoomFactor]; | |
| 218 | +} | |
| 219 | + | |
| 220 | +#pragma mark - notification !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
| 221 | +// 进入后台 | |
| 147 | 222 | - (void)enterBg { |
| 148 | 223 | |
| 149 | 224 | [_kitCN appEnterBackground]; |
| 150 | 225 | } |
| 151 | - | |
| 226 | +// 回到前台 | |
| 152 | 227 | - (void)becameActive { |
| 153 | 228 | |
| 154 | 229 | [_kitCN appBecomeActive]; |
| 155 | 230 | } |
| 156 | - | |
| 231 | +// 拍摄状态改变 | |
| 157 | 232 | - (void)captureStateChange { |
| 158 | 233 | |
| 159 | 234 | if ( _kitCN.captureState == CNLiveCaptureStateIdle){ |
| ... | ... | @@ -195,7 +270,7 @@ |
| 195 | 270 | |
| 196 | 271 | } |
| 197 | 272 | } |
| 198 | - | |
| 273 | +// 推流状态改变 | |
| 199 | 274 | - (void)streamStateChange { |
| 200 | 275 | |
| 201 | 276 | if (_kitCN.streamState == CNLiveStreamStateIdle) { |
| ... | ... | @@ -237,7 +312,7 @@ |
| 237 | 312 | // _stateLab.text = @"CNLiveStopStreamSuccess"; |
| 238 | 313 | } |
| 239 | 314 | } |
| 240 | - | |
| 315 | +// 推流失败 | |
| 241 | 316 | - (void)onStreamError { |
| 242 | 317 | |
| 243 | 318 | CNLiveStreamErrorCode err = _kitCN.streamErrorCode; |
| ... | ... | @@ -263,6 +338,7 @@ |
| 263 | 338 | |
| 264 | 339 | } else if (err == CNLiveStreamErrorCode_CODEC_OPEN_FAILED) { |
| 265 | 340 | NSLog(@"video codec open failed, try software codec"); |
| 341 | + // 换个编码类型重新尝试 | |
| 266 | 342 | _kitCN.streamerBase.videoCodec = CNLiveVideoCodec_VT264; |
| 267 | 343 | [self tryReconnect]; |
| 268 | 344 | } |
| ... | ... | @@ -277,6 +353,7 @@ |
| 277 | 353 | |
| 278 | 354 | } |
| 279 | 355 | |
| 356 | +// 重试 | |
| 280 | 357 | - (void) tryReconnect { |
| 281 | 358 | |
| 282 | 359 | dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)); |
| ... | ... | @@ -298,7 +375,7 @@ |
| 298 | 375 | }); |
| 299 | 376 | } |
| 300 | 377 | |
| 301 | -// | |
| 378 | +// 提示框 | |
| 302 | 379 | - (void)toast:(NSString*)message |
| 303 | 380 | { |
| 304 | 381 | |
| ... | ... | @@ -350,6 +427,47 @@ |
| 350 | 427 | return pointOfInterest; |
| 351 | 428 | } |
| 352 | 429 | |
| 430 | +#pragma mark - Action !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
| 431 | + | |
| 432 | +- (void)addObservers { | |
| 433 | + | |
| 434 | + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(captureStateChange) name:CNLiveCaptureStateDidChangeNotification object:nil]; | |
| 435 | + | |
| 436 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 437 | + selector:@selector(streamStateChange) | |
| 438 | + name:CNLiveStreamStateDidChangeNotification | |
| 439 | + object:nil]; | |
| 440 | + | |
| 441 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 442 | + selector:@selector(enterBg) | |
| 443 | + name:UIApplicationDidEnterBackgroundNotification | |
| 444 | + object:nil]; | |
| 445 | + | |
| 446 | + [[NSNotificationCenter defaultCenter] addObserver:self | |
| 447 | + selector:@selector(becameActive) | |
| 448 | + name:UIApplicationDidBecomeActiveNotification | |
| 449 | + object:nil]; | |
| 450 | +} | |
| 451 | + | |
| 452 | +- (UIButton *)addButton:(NSString*)title | |
| 453 | + frame:(CGRect)frame | |
| 454 | + action:(SEL)action { | |
| 455 | + UIButton * button; | |
| 456 | + button = [UIButton buttonWithType:UIButtonTypeCustom]; | |
| 457 | + button.frame = frame; | |
| 458 | + [button setTitle: title forState: UIControlStateNormal]; | |
| 459 | + [button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside]; | |
| 460 | + button.titleLabel.font = [UIFont systemFontOfSize:15]; | |
| 461 | + [button setTitleColor:[UIColor colorWithRed:23/255.0 green:110/255.0 blue:254/255.0 alpha:1] forState:UIControlStateNormal]; | |
| 462 | + button.layer.cornerRadius = 10; | |
| 463 | + button.layer.masksToBounds = YES; | |
| 464 | + button.layer.borderColor = [UIColor blackColor].CGColor; | |
| 465 | + button.layer.borderWidth = 1; | |
| 466 | + [self.captureView addSubview:button]; | |
| 467 | + return button; | |
| 468 | + | |
| 469 | +} | |
| 470 | + | |
| 353 | 471 | - (void)didReceiveMemoryWarning { |
| 354 | 472 | [super didReceiveMemoryWarning]; |
| 355 | 473 | // Dispose of any resources that can be recreated. | ... | ... |