具体API调用看代码(show me code):码云
H264参考loyinglin
ios9:可以录制本APP的屏幕,完成录制后才能获取到完整视频
ios10:可以录制本APP的屏幕,完成录制后才能获取到完整视频;新增Broadcast Upload Extension可以获取到录制过程中的音视频流(只能录制本APP)
ios11:可以录制本APP的屏幕,完成录制后才能获取到完整视频;新增Broadcast Upload Extension可以获取到录制过程中的音视频流(只能录制本APP);新增录制过程中可以获取到音视频流;Broadcast Upload Extension新增可以录制所有屏幕内容(包括系统和其他APP)
ios12:可以录制本APP的屏幕,完成录制后才能获取到完整视频;新增Broadcast Upload Extension可以获取到录制过程中的音视频流(只能录制本APP);新增录制过程中可以获取到音视频流;Broadcast Upload Extension新增可以录制所有屏幕内容(包括系统和其他APP);新增在APP内部直接调起Broadcast Upload Extension(不用上拉屏幕录制然后点击按钮或者RPBroadcastActivityViewController)
调起Broadcast Upload Extension的方式:1.上拉工具栏找到屏幕录制(长按选择)2. RPBroadcastActivityViewController弹出选择列表;3.RPSystemBroadcastPickerView直接APP内调起
其中第一第二点ios10以上才有,第三点ios12以上才有
上面这是都是API,下面说一下一些注意点
第一:Broadcast Upload Extension需要在xcode中选择Broadcast Upload Extension对应的target运行一次才会注册到系统中,也就是长按控制中心的屏幕录制或者RPBroadcastActivityViewController列表中才会出现你的APP;(我遇到一个坑:我的xcode是最新的,新建的Broadcast Upload Extension默认的Deployment Target是12.0,而我的手机是11.3的系统,结果运行了Extension对应的target,也没有注册到系统中,不管是长按控制中心的屏幕录制还是RPBroadcastActivityViewController列表中都没有我的APP,心中一万匹**马)
第二:Broadcast Upload Extension能用了,在回调中(processSampleBuffer)也就是能拿数据了,但是不知道怎么处理这个数据,第一反应肯定是写沙盒嘛:一顿操作下来发现写在沙盒(路径和APP不一样:../Plugin/..)里面了怎么拿出来呢,那就保存到相册吧,但是调用写入到相册发现压根就没有保存到,而且发现extension的沙盒内存只有50M,我测试录制比较短是能写到沙盒中,录制比较久就没有读取到,推断没有保存到(猜的),找的Demo是录屏直播的所以在数据回调里面去推流就行了(插曲:想去抓斗鱼的推流地址,注册了直播折腾一下没抓到,有人知道可以分享一下),论坛里面有人说可以通过socket向宿主APP传输数据,有兴趣可以去尝试一下,后来找到了Extension数据共享的方发:APP Groups, 开发者注册一下(直接xcode也行)然后在宿主和Extension中的capablilities中的App Groups中添加同一个注册好的groupID,然后通过NSURL *groupURL = [[NSFileManager defaultManager]containerURLForSecurityApplicationGroupIdentifier:@“你注册的groupID”];//返回与指定的安全应用程序组ID关联的容器目录。然后把数据写到这个目录下,这样你就可以在宿主APP中去读取到数据了,这里也有一个坑:最好是编码一下,不要直接CMSampleBufferRef保存,这个是音视频原始数据很大的,Demo中有VideoToolbox进行H264编解码
第三:如果再Broadcast Upload Extension处理不当崩溃了,那么恭喜你,重启手机吧,不然下次Broadcast Upload Extension你就会发现调不起了。
第四:processSampleBuffer这个回调里面返回了三种数据:视频、APP音频、麦克风音频。一不小心没有判断直接H264编码回调的buffer,崩溃,一顿排查,音频编码使用H264,VTCompressionSessionRef为空。
第五:还有一种录制屏幕方式:通过不断截屏然后拼接成视频,很耗性能
第六:Broadcast Upload UI这个可以在你录制前定制UI,比如直播前填写直播地址等等设置,这个UI在点击RPBroadcastActivityViewController列表后弹出
最后总结一下:
直播:也就是要拿到录屏的音视频流,1.如果只是录制本APP那么使用RPScreenRecorder:startCaptureWithHandler(ios11以上)或者使用RPBroadcastActivityViewController调起Broadcast Upload Extension在processSampleBuffer中获取音视频流(ios10以上);2.如果不只是录制本APP那就只能使用Broadcast Upload Extension(iOS11以上)在processSampleBuffer回调中去推流
纯粹的录制屏幕:RPScreenRecorder,不同系统版本拿到的数据不同(ios9只能录制完成后拿到完整的视频,ios10后可以拿到音视频流);录制本APP屏幕:RPScreenRecorder(ios9以上);录制所有屏幕:Broadcast Upload Extension(ios11以上)。
网友评论