ios-Pili直播使用和问题总结
来源:互联网 发布:海关数据信息网源码 编辑:程序博客网 时间:2024/04/26 12:13
1.建议使用cocoapods导入sdk使用,可以参考文档:https://github.com/pili-engineering/PLCameraStreamingKit#%E9%85%8D%E7%BD%AE%E5%B7%A5%E7%A8%8B
2.代码梳理
demo:
https://github.com/pili-engineering/PLCameraStreamingKit/tree/master/Example
2.1 在 AppDelegate.m 中初始化sdk,否则会抛出异常#import <PLStreamingKit/PLStreamingEnv.h>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ [PLStreamingEnv initEnv]; // Override point for customization after application launch. return YES;}2.2 导入头文件,使用代理(不要忘记设置代理和初始化数据)#import <PLCameraStreamingKit/PLCameraStreamingKit.h>@interface ViewController ()<PLCameraStreamingSessionDelegate,PLStreamingSendingBufferDelegate>2.3 - (void)viewDidLoad { [super viewDidLoad]; //初始化串行队列 DISPATCH_QUEUE_SERIAL self.sessionQueue = dispatch_queue_create("pili.queue.streaming", DISPATCH_QUEUE_SERIAL); /* 先判断是否授权,switch 根据不同的授权调用相应的方法 未授权,授权后在执行 授权,配置流的相关信息 */ //判断相机、麦克风是否授权 switch ([PLCameraStreamingSession cameraAuthorizationStatus]) { //授权 case PLAuthorizationStatusAuthorized: permissionBlock(); break; //未授权 case PLAuthorizationStatusNotDetermined: { [PLCameraStreamingSession requestCameraAccessWithCompletionHandler:^(BOOL granted) { granted ? permissionBlock() : noAccessBlock(); }]; } break; default: noAccessBlock(); break; } //未授权 void (^noAccessBlock)(void) = ^{ //询问是否授权 UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"授权" message:@"是否授权" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]; UIAlertAction *defult = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]; [alert addAction:cancel]; [alert addAction:defult]; [self presentViewController:alert animated:YES completion:nil]; }; //授权,添加配置信息 void (^permissionBlock)(void) = ^{ //相机采集信息配置 PLVideoCaptureConfiguration *videoCC = [[PLVideoCaptureConfiguration alloc] initWithVideoFrameRate:20 sessionPreset:AVCaptureSessionPresetiFrame1280x720 horizontallyMirrorFrontFacingCamera:YES horizontallyMirrorRearFacingCamera:NO cameraPosition:AVCaptureDevicePositionFront]; //麦克风采集信息配置 PLAudioCaptureConfiguration *audioCC = [PLAudioCaptureConfiguration defaultConfiguration]; //推流设置 视频(即播放的效果) PLVideoStreamingConfiguration *videoSC = [PLVideoStreamingConfiguration configurationWithVideoSize:CGSizeMake(320, 570) videoQuality:kPLVideoStreamingQualityLow1]; //推流设置 音频 PLAudioStreamingConfiguration *audioSC = [PLAudioStreamingConfiguration configurationWithAudioQuality:kPLAudioStreamingQualityHigh2] //设置摄像头 AVCaptureVideoOrientation orientation = (AVCaptureVideoOrientation)(([[UIDevice currentDevice] orientation] <= UIDeviceOrientationLandscapeRight && [[UIDevice currentDevice] orientation] != UIDeviceOrientationUnknown) ? [[UIDevice currentDevice] orientation]: UIDeviceOrientationPortrait); //后端获取流的信息(字典格式) PLStream *stream = [PLStream streamWithJSON:dict]; //流 初始化 self.streamSession = [[PLCameraStreamingSession alloc]initWithVideoCaptureConfiguration:videoCC audioCaptureConfiguration:audioCC videoStreamingConfiguration:videoSC audioStreamingConfiguration:audioSC stream:stream videoOrientation:orientation]; //代理设置 self.streamSession.delegate = self; self.streamSession.bufferDelegate = self; //添加水印 UIImage *image = [UIImage imageNamed:@"test.jpeg"]; PLFilterHandler fitleHandler = [self.streamSession addWaterMark:image origin:CGPointMake(20, 60)]; //在主线程中设置预览界面 dispatch_async(dispatch_get_main_queue(), ^{ UIView *previewView = self.streamSession.previewView; //根据枚举值调整预览视图的位置 previewView.autoresizingMask = UIViewAutoresizingFlexibleHeight| UIViewAutoresizingFlexibleWidth; [self.view insertSubview:previewView atIndex:0]; //缩放设置 self.zoomSlider.minimumValue = 1; self.zoomSlider.maximumValue = MIN(5, self.streamSession.videoActiveFormat.videoMaxZoomFactor); }); };}#pragma mark -销毁- (void)dealloc { dispatch_sync(self.sessionQueue, ^{ [self.streamSession destroy]; }); self.streamSession = nil; self.sessionQueue = nil;}//停止推流- (void)stopSession { dispatch_async(self.sessionQueue, ^{ self.keyTime = nil; [self.streamSession stop]; });}//开始推流- (void)startSession { self.keyTime = nil; self.actionBtn.enabled = NO; dispatch_async(self.sessionQueue, ^{ [self.streamSession startWithCompleted:^(BOOL success) { dispatch_async(dispatch_get_main_queue(), ^{ self.actionBtn.enabled = YES; }); }]; });}//通过按钮控制开始或者停止- (IBAction)clickAction:(id)sender { if (PLStreamStateConnected == self.streamSession.streamState) { [self stopSession]; } else { [self startSession]; }}
3.代理和其他的方法可以参考链接:
http://blog.csdn.net/glassy_sky1207/article/details/51852245
4.纯音频推流可以在数据采集和推流是忽略相机参数
5.push URL 原因
1) 请求streamjson用的异步处理,初始化session时数据没有传输过来
2)使用了无鉴权的方式,目前ios推流只支持 static和dynamic 两种鉴权方式
6.出现URL is not authorited ,请工单提供streamjson 的数据
7.首屏秒开的设置的是默认值
0 0
- ios-Pili直播使用和问题总结
- 七牛---Pili直播推流SDK问题总结
- 直播总结 ios
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- iOS: FFMpeg编译和使用问题总结
- iOS: FFmpeg编译和使用问题总结
- 获取视频的缩略图
- cron表达式详解
- 开发必知必用网站(持续更新)
- redis常用命令
- Insert Delete GetRandom O(1)
- ios-Pili直播使用和问题总结
- Leetcode: 在原矩阵上实现矩阵的旋转(Python)
- 类似微信文本输入框实现,底部评论输入View,随着文字的增加,textView自增长高度
- 手机网民增加的原因
- Spring 4支持的Java 8新特性一览
- Android-代码设置图片大小及位置
- OS X终端使用配置socks5 代理
- 第二课:Hello Scala scala 程序控制结构
- onSaveInstanceState()方法