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的启动图. 隐藏导航栏的界面,会出现无法贴合屏幕顶部(一般来说, ...
随机推荐
- EVA: Visual Representation Fantasies from BAAI
本文做个简单总结,博主不是做自监督领域的,如果错误,欢迎指正. 链接 Code: Official:baaivision/EVA MMpretrain:open-mmlab/mmpretrain/ ...
- OpenSergo & CloudWeGo 共同保障微服务运行时流量稳定性
简介: 流控降级与容错是微服务流量治理中的重要的一环,同时 MSE 还提供更广范围.更多场景的微服务治理能力,包括全链路灰度.无损上下线.微服务数据库治理.日志治理等一系列的微服务治理能力. 作者:宿 ...
- [FE] 浅谈 Chakra UI 的现代化浅封装 - 语义化大行其道
Web2.0 发展至今,网页元素越来越丰富和多样化,数据越来越多. 从需求上来说,也已经不再是展示简单个静态网页,高效的开发交互.打通后端数据,产生了 React 和 Vue 两个著名框架. Re ...
- dotnet 提升 ToUpper 性能
在应用软件启动过程中,客户端应用软件是对性能敏感的.比如在解析命令行参数的时候,有时候需要进行字符串处理逻辑.一般来说命令行参数都是语言文化无关的,在需要进行全大写或全小写转换过程中,采用 ToUpp ...
- vue解决二级路由redirect(默认路由)不传参的问题
场景: pageA----pageB(pageB包含三个二级路由) 默认进入pageB时进入第一个页面的路由,之后点击左侧按钮,分别进入其他二级路由 原router.js写法: //应用信息 ...
- Java面试题:你知道Spring的IOC吗?那么,它为什么这么重要呢?
Spring的IOC(控制反转)是一种设计模式,它允许开发者将对象的创建和管理交给Spring框架来完成.在Spring中,IOC允许开发者将对象依赖关系从代码中分离出来,从而使代码更加灵活.可重用和 ...
- 259k+ Star!这是我见过最全的开发者技术学习路线!
大家好,我是 Java陈序员. 自从上班后,身体是一天不如一天了,也很少有时间可以去学习新技术了.程序员如果技术跟不上,很容易就被淘汰. 而碎片化的学习效率又不高,往往今天学了,明天就忘了.有时候更是 ...
- 羽夏闲谈—— Kdenlive flatpak 版本解决语音识别找不到 pip3
简述 Kdenlive是在 Linux 上一款比较优秀的剪辑软件,功能比较强大.操作相对容易,能够满足日常剪辑的需要. 解决方案 找到对应的安装目录/var/lib/flatpak/app/o ...
- 运行程序时报go: cannot find main module, but found .git/config in
编写单元测试,运行时报下面的错误 haima@haima-PC:/media/haima/34E401CC64DD0E28/site/go/src/haimait/learn/base/cheshi0 ...
- Golang 爬虫02
验证邮箱 目标站点: https://movie.douban.com/top250