iOS11 ReplayKit2 问题总结
一、苹果自6月30日发布iOS11系统之后,其中的Airplay的协议发生变更,导致市场上的苹果直播助手(录屏)大部分变得不可用,因此在iOS11之后需要寻找新的技术方案来录屏
1)采用系统提供的ReplayKit2 包含的System Screen Record的框架
2) 采用libUSB的方案,这个方案利用的苹果的USB协议,github上面已经存在一个库,据说比较难编译,国外的直播平台Mobcrush,体验了一下效果非常好。
二、采用苹果的提供的方案才是正途,不然以后每次升级去破解Airplay的协议太折腾,也不经济。下面总结遇到的一些难题
1)ReplayKit2 本身存在bug,在不断更新的beta版本中,一直存在框架回调视频帧时序错位、声音消失,无法正常启动框架必须重启
2)ReplayKit2 开发Xcode调试很难,每次启动调试,Xcode调试器默认挂起的是主App,如果你需要调试一个一启动就发生的问题,很可能进程直接结束了,调试器什么信息都没有,吐槽Xcode
苹果这么大的市值,到底拿出多少钱用于研发测试,大概以大众为测试,这种态度一定会没落!!!
3)ReplayKit2 直到正式版本中存在的问题,内存不能超过50MB,如果一超过,系统马上干掉你
4)ReplayKit2 与主App之间没有进程通信机制(重大缺陷),直播平台一般主播都有自己的账号,直播权限,弹幕,礼物,苹果只考虑推流么??并且推的流还只能是竖屏,需要hack解决
三、一些经验
1)内存不能超过50MB
在系统回调给你的YUV数据(NV12格式)中,这个回调在多个线程,之前为了避免时序的问题,将回调统一调度到一个串行队列中:
if([_txLivePush isPublishing]){
__weak typeof(self) wSelf = self;
CFRetain(videoSample);
dispatch_async(_encodeQueue, ^{
[wSelf NV12ToI420AndRotate:videoSample];
// [_txLivePush sendVideoSampleBuffer:videoSample];
CFRelease(videoSample);
});
这里带来一个问题,大屏手机在按home键的过程中,upload进程的线程调度受到影响,导致视频数据在队列中积压,内存峰值一旦超过50MB,系统立马把你杀掉
所以在视频的数据流中,一定要注意缓冲区的长度,申请内存一般不要超过3MB,采用同步的方案更可控一些
2)隐私模式
隐私模式就是将系统给的数据替换成一张YUV图片,通常涉及给到的是PNG、JPG
这里需要将JPG->UIImage->pix Data -> YUV I420
下面是一些介绍:
PG->UIImage->pix Data
+ (unsigned char *)pixelARGBBytesFromImageRef:(CGImageRef)imageRef {
NSUInteger iWidth = CGImageGetWidth(imageRef);
NSUInteger iHeight = CGImageGetHeight(imageRef);
NSUInteger iBytesPerPixel = 4;
NSUInteger iBytesPerRow = iBytesPerPixel * iWidth;
NSUInteger iBitsPerComponent = 8;
unsigned char *imageBytes = malloc(iWidth * iHeight * iBytesPerPixel);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(imageBytes,
iWidth,
iHeight,
iBitsPerComponent,
iBytesPerRow,
colorspace,
kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGRect rect = CGRectMake(0 , 0 , iWidth , iHeight);
CGContextDrawImage(context , rect ,imageRef);
CGColorSpaceRelease(colorspace);
CGContextRelease(context);
CGImageRelease(imageRef);
return imageBytes;
}
上面的方法将UIImage转成ARGB的格式,因为libyuv中有一个ARGBToI420的方法。上面的方法中注意选项
kCGImageAlphaNone, /* For example, RGB. */
kCGImageAlphaPremultipliedLast, /* For example, premultiplied RGBA */
kCGImageAlphaPremultipliedFirst, /* For example, premultiplied ARGB */
kCGImageAlphaLast, /* For example, non-premultiplied RGBA */
kCGImageAlphaFirst, /* For example, non-premultiplied ARGB */
kCGImageAlphaNoneSkipLast, /* For example, RBGX. */
kCGImageAlphaNoneSkipFirst, /* For example, XRGB. */
kCGImageAlphaOnly
控制颜色通道的顺序,数据的大小端
转好的数据,再转成I420
//ToI420
CVReturn rc = CVPixelBufferCreate(NULL,
imgSize.width,
imgSize.height,
kCVPixelFormatType_420YpCbCr8PlanarFullRange,
NULL,
&_pausePixBuffer); rc = CVPixelBufferLockBaseAddress(_pausePixBuffer, 0); uint8_t *y_copyBaseAddress = (uint8_t*)CVPixelBufferGetBaseAddressOfPlane(_pausePixBuffer, 0);
uint8_t *u_copyBaseAddress = (uint8_t*)CVPixelBufferGetBaseAddressOfPlane(_pausePixBuffer, 1);
uint8_t *v_copyBaseAddress = (uint8_t*)CVPixelBufferGetBaseAddressOfPlane(_pausePixBuffer, 2); size_t dYLineSize = (size_t)CVPixelBufferGetBytesPerRowOfPlane(_pausePixBuffer, 0);
size_t dULineSize = (size_t)CVPixelBufferGetBytesPerRowOfPlane(_pausePixBuffer, 1);
size_t dVLineSize = (size_t)CVPixelBufferGetBytesPerRowOfPlane(_pausePixBuffer, 2); tx_ARGBToI420(argbData,
imgSize.width*4,
y_copyBaseAddress,
(int)dYLineSize,
u_copyBaseAddress,
(int)dULineSize,
v_copyBaseAddress,
(int)dVLineSize,
(int)imgSize.width,
(int)imgSize.height); free(argbData);
kCVPixelFormatType_420YpCbCr8PlanarFullRange 代表I420的格式
iOS11 ReplayKit2 问题总结的更多相关文章
- iOS11和机器学习CoreML库
随着iOS11的发布,苹果公司也正式加入了机器学习的战场.在新的iOS11中内置了CoreML,虽然还是Beta版本,但是功能已经非常强大了. 在这个CoreML库里面,已经集成了一些训练好的模型,可 ...
- 你可能需要为你的APP适配iOS11
WeTest 导读 iOS 11 为整个生态系统的 UI 元素带来了一种更加大胆.动态的新风格. 本文介绍了iOS11在UI方面做了哪些更新,有些更新可以为用户提供更加完美的体验,但也有的可能会给目 ...
- 关于ios11 tableView和ScrollView受导航栏影响向下偏移的问题
看到网上说法ios11中automaticallyAdjustsScrollViewInsets属性被废弃,所以要设置tableView.contentInsetAdjustmentBehavior ...
- 适配ios11与iphone x实践
一.适配iOS11 问题1:项目中有原生与H5的交互,运行在iOS11时,直接漰溃在框架WebViewJavascriptBridge内部. 报错信息:Completion handler passe ...
- iOS11、iPhone X、Xcode9 适配
更新iOS11后,发现有些地方需要做适配,整理后按照优先级分为以下三类: 1.单纯升级iOS11后造成的变化: 2.Xcode9 打包后造成的变化: 3.iPhoneX的适配 一.单纯升级iOS11后 ...
- 独家探寻阿里安全潘多拉实验室,完美越狱苹果iOS11.2.1
知道如何从攻击的视角去发现漏洞,才能建立更安全的体系,促进了整个生态的良性发展.以阿里安全潘多拉实验室为例,在对移动系统安全研究的过程中,把研究过程中发现的问题上报给厂商,促进系统安全性的提升. 小编 ...
- 58 同城 iOS 客户端 iOS11 及 iPhone X 适配实践
一.前言 前段时间 WWDC 大会上苹果推出了 iOS11 系统 和 iPhone X 新机型,相信各个 iOS 团队的开发者都已经在计划新系统和新机型的适配工作了.不得不说,新系统和新机型的发布确实 ...
- ios11,弹出层内的input框光标错位 键盘弹出时,输入信息,光标一直乱跳
之前开发了一个微信项目,维护期中苹果手机突然出现光标错位现象,经过排查,发现是最新的ios11系统的锅. 具体情况:弹出层使用position: fixed:弹出层内附带input/textare ...
- [转] iOS11.3 fastclick.js相关bug
最近遇到奇异的bug,在ios 11.3移动端页面 input输入框第一次触摸可以弹起键盘,后续再触摸需要很难弹起键盘,或者需要在输入框停一会才能弹起键盘. bug复现条件: 一.ios 11.3中a ...
- 适配iOS11
总结在iOS11系统中出现的适配问题: 启动app发现上下有空隙,不能完全贴合屏幕----- 解决方案:添加一张尺寸为1125x2436的启动图. 隐藏导航栏的界面,会出现无法贴合屏幕顶部(一般来说, ...
随机推荐
- 修改中文、英文参考文献在文末列表中的顺序:EndNote
本文介绍在EndNote软件中,使得参考文献按照语种排列,中文在前.英文在后的方法. 前期我们在EndNote参考文献格式Output Styles界面介绍一文中,详细介绍了文献管理软件End ...
- 【笔记】connect by中的nocycle
connect by主要用于父子,祖孙,上下级等层级关系的查询 常用的是prior,nocycle prior: 查询父行的限定符,格式: prior column1 = column2 or col ...
- 【编程】C++ 常用容器以及一些应用案例
介绍一些我常用的C++容器和使用方法,以及使用案例.blog 1 概述 容器(Container)是一个存储其他对象集合的持有者对象.容器以类模板实现,对支持的元素类型有很大的灵活性.容器管理元素的存 ...
- 力扣387(java)-字符串中的第一个唯一字符(简单)
题目: 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 .如果不存在,则返回 -1 . 示例 1: 输入: s = "leetcode"输出: 0示例 2: 输 ...
- [FAQ] Member "address" not found or not visible after argument-dependent lookup in address payable.
顾名思义,address 属性不存在,请检查调用方. 比如:msg.sender.address 会有此提示,在 Solidity Contract 中,msg.sender.balance 是存在的 ...
- OLAP系列之分析型数据库clickhouse主从副本模式(三)
一.测试单分片,单副本或多副本模式 # 1.停止集群 systemctl stop clickhouse-server # 修改配置文件 vim /etc/clickhouse-server/conf ...
- Linux 根文件系统的移植(从入门到精通)
一.简介 提到操作系统的安装,还得从大学的时候说起,刚入学的时,朋友的系统本崩了,跑去电脑城换个系统花了40大洋,震惊了贫穷的我.好像发现了商机,果断开始了折腾自己的电脑,然后用朋友的电脑进行测试,由 ...
- SQL窗口分析函数使用详解系列三之偏移量类窗口函数
1.综述 本文以HiveSQL语法进行代码演示. 对于其他数据库来说同样也适用,比如SparkSQL,FlinkSQL以及Mysql8,Oracle,SqlServer等传统的关系型数据库. 已更新第 ...
- Oracle细粒度审计策略
场景:经常需要查看某些表做了哪些操作. Oracle中,可以添加细粒度策略来获取,如下: begin dbms_fga.add_policy(object_schema => 'portxx', ...
- 模型评测-书生浦语大模型实战营学习笔记7&大语言模型12
大语言模型学习-12.模型评测 书生浦语大模型实战营学习笔记7 视频教程特别像广告,所以这篇博客参考了很多其他内容给大家参考,主要是下面几个页面: https://zhuanlan.zhihu.com ...