SDK下载地址:https://github.com/upyun/ios-live-sdk
运行环境:iOS8以上,并只能在真机中运行,不然会报错
模拟器调试过滤:
#if !TARGET_OS_SIMULATOR
...
#endif
主要文件:UPLiveService
CPUImage -- 视频处理
UPAVCapturer -- 音视频采集模块,直播接口
UPLiveSDKDll.framework -- 包含播放器UPAVPlayer 、推流器UPAVStreamer
TARGET -> Build Settings -> Enable bitcode
: 设置为 NO
TARGET -> General -> Embedded Binaries
: 添加选择 UPLiveSDKDll.framework
注: 如果需要 app 退出后台仍然不间断推流直播,需要设置 TARGET -> Capabilities -> Backgroud Modes:ON √ Audio, AirPlay,and Picture in Picture
工程依赖:
AVFoundation.framework
QuartzCore.framework
OpenGLES.framework
VideoToolbox.framework
AudioToolbox.framework
Accelerate.framework
libbz2.1.0.tbd
libiconv.tbd
libz.tbd
CoreMedia.framework
CoreTelephony.framework
SystemConfiguration.framework
libc++.tbd
CoreMotion.framework
1、推流
//1. 设置预览画面
UIView *livePreview = [[UPAVCapturer sharedInstance] previewWithFrame:self.view.bounds
contentMode:UIViewContentModeScaleAspectFit];
//2. 将预览画面添加到 view
[self.view insertSubview:livePreview atIndex:0];
//3. 设置代理,接收直播状态回调
[UPAVCapturer sharedInstance].delegate = self;
//4. 设置推流地址
[UPAVCapturer sharedInstance].outStreamPath = [NSString stringWithFormat:@"rtmp://testlivesdk.v0.upaiyun.com/live/%@", _streamId];
//6. 设置视频采集尺寸。其他详细设置请参考高级示例。
[UPAVCapturer sharedInstance].capturerPresetLevel = UPAVCapturerPreset_640x480;
//6. 开始推流
[[UPAVCapturer sharedInstance] start];
//7. 结束推流
[[UPAVCapturer sharedInstance] stop];
2、拉流
//1. 初始化播放器
_player = [[UPAVPlayer alloc] initWithURL:@"rtmp://live.hkstv.hk.lxdns.com/live/hks"];
//2. 设置代理,�接收状态回调信息
_player.delegate = self;
//3. 设置播放器 playView Frame
[_player setFrame:self.view.bounds];
//4. 添加播放器 playView
[self.view insertSubview:_player.playView atIndex:0];
//5. 开始播放
[_player play];
//6. 停止播放
[_player stop];
3、代理回调
#pragma mark - UPAVPlayerDelegate
- (void)player:(UPAVPlayer *)player playerError:(NSError *)error {
//7. 监听播放错误。
[self.activityIndicatorView stopAnimating];
self.bufferingProgressLabel.hidden = YES;
UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"主播已停止直播" message:nil preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];
}
- (void)player:(UPAVPlayer *)player playerStatusDidChange:(UPAVPlayerStatus)playerStatus{
switch (playerStatus) {
case UPAVPlayerStatusIdle:{
NSLog(@"播放停止-----");
[self.activityIndicatorView stopAnimating];
self.bufferingProgressLabel.hidden = YES;
}
break;
case UPAVPlayerStatusPause:{
NSLog(@"播放暂停-----");
[self.activityIndicatorView stopAnimating];
self.bufferingProgressLabel.hidden = YES;
}
break;
case UPAVPlayerStatusPlaying_buffering:{
NSLog(@"播放缓冲-----");
[self.activityIndicatorView startAnimating];
self.bufferingProgressLabel.hidden = NO;
}
break;
case UPAVPlayerStatusPlaying:{
// _isSeeking = NO;
NSLog(@"播放中-----");
[self.activityIndicatorView stopAnimating];
self.bufferingProgressLabel.hidden = YES;
}
break;
case UPAVPlayerStatusFailed:{
NSLog(@"播放失败-----");
}
break;
default:
break;
}
}
- (void)player:(UPAVPlayer *)player displayPositionDidChange:(float)position{
NSLog(@"live_position:%f",position);
}
- (void)player:(UPAVPlayer *)player bufferingProgressDidChange:(float)progress{
self.bufferingProgressLabel.text = [NSString stringWithFormat:@"%.0f %%", (progress * 100)];
NSLog(@"live_progress:%f",progress);
}
4、视频流状态
//视频流状态
- (void)player:(UPAVPlayer *)player streamStatusDidChange:(UPAVStreamStatus)streamStatus{
switch (streamStatus) {
case UPAVStreamStatusIdle:
NSLog(@"连接断开-----");
break;
case UPAVStreamStatusConnecting:{
NSLog(@"建立连接-----");
}
break;
case UPAVStreamStatusReady:{
NSLog(@"连接成功-----");
}
break;
default:
break;
}
}