ios11录屏(iOS端屏幕录制开发指南)

Ios11屏幕录制(Ios端屏幕录制开发指南) 一.概述 在直播过程中,分享屏幕分为两个步骤:屏幕数据采集和流媒体数据推送。对于iOS,也就是以前的悠游资源网来说,屏幕获取需要系统的许可,这...

ios11录屏(iOS端屏幕录制开发指南)

Ios11屏幕录制(Ios端屏幕录制开发指南)

一.概述

在直播过程中,分享屏幕分为两个步骤:屏幕数据采集和流媒体数据推送。对于iOS,也就是以前的悠游资源网来说,屏幕获取需要系统的许可,这是受到iOS系统限制的。第三方app没有直接录屏的权限,必须通过系统的函数来实现。

本文将描述iOS系统中屏幕共享的应用、实现、限制和实现细节的研究成果。(注:由于iOS 10及之前的系统只支持应用内录制屏幕,所以只是简单介绍,不做详细说明)

二、应用

屏幕共享很早出现在视频会议中,后来大规模出现在一些游戏直播中。苹果早期并不支持屏幕共享,但随着直播的普及,苹果也支持根据用户需求进行屏幕共享,并推出了ReplayKit库来迎合这种场景。

市面上屏幕共享的场景大致分类如下:

1.远程操作屏:辅助他人操作手机。比如年轻人帮老年人远程设置, *** 帮该群客户解决软件故障或者使用帮助群,有效解决语言表达效率低下的问题。

二。游戏直播:知名游戏主播可以将自己手机上玩的游戏的直播画面直播给他人,可以对游戏进行教学和讲解,让别人更好地学习游戏技巧。

三。视频会议:会议室将手机中的内容展示给其他人讲解,如邮件内容、图片、手机中的文档等,让与会者快速分享信息,提高沟通效率。

第三,各系统实现屏幕共享。

在iOS系统上实现屏幕共享的技术主要在于系统不同版本之间的差异。在这里,我们将比较每个系统版本的实现 *** 和局限性。首先,由于需要使用手机的摄像头、麦克风等硬件,无法在模拟器上调试使用。首先,我们先了解一下目前各个版本的覆盖情况。

系统覆盖率

根据苹果官网的数据,截至2021年6月,iOS系统版本的份额大致如下图所示。可以看到,目前iOS13及以下的用户覆盖率不到2%,而iOS14约为90%,iOS13约为8%。为了兼顾老版本,目前市面上的应用普遍兼容iOS 9。

iOS 8

在OS 8及之前的版本中,系统并没有提供相应的功能,是通过破解系统的功能,调用私有API来实现的。因为iOS8太老了,运行iOS8系统的设备基本不能支持直播的功能,这里就不详细讨论了。有兴趣的可以研究一下。

IOS 9系统

苹果iOS 9推出了ReplayKit框架,提供了屏幕录制功能,但限制是只能录制这个App里的屏幕。录制后会生成一个视频文件,只能用RPPreviewViewController预览,生成的文件可以编译。在录制过程中,无法获得任何数据,只能将最终录制的整个mp4文件提供给开发者。所以实际上并不是真正的屏幕直播分享,实时性无法保证。

IOS 10系统

IOS 10苹果推出了广播上传扩展和广播设置UI扩展来解决屏幕录制的问题。

先介绍一下App扩展,官方文档(扩展的官方文档)。Extension是App的扩展,在一定程度上打破了沙盒的限制,提供了应用之间通信的可能。扩展是一个独立的过程,有自己的生命周期。如下图所示:

虽然iOS 10系统解决了之前系统的一系列缺点,但仍然无法解决只能记录当前app的屏幕内容,会限制部分应用的使用场景的问题。

IOS 11系统

在iOS 11正式直播的时代,为了满足市场需求,苹果提供了跨app录屏的功能,可以实现承认整屏的功能。虽然ReplayKit2已经可以满足开发者的大部分需求,但是对于用户来说,该版本实现屏幕直播时,需要用户提前在手机设置中配置好屏幕录制的访问控制权限,使屏幕录制按钮可以显示在系统的上拉管理菜单中,录制时拉下底部菜单调出快捷管理菜单,按住屏幕录制的圆形按钮开始录制和直播。复杂的操作流程提高了用户的使用门槛。所以iOS 11上的屏幕分享功能也很单薄。

IOS12系统

IOS 12在iOS11的基础上进行了优化,提供了RPSystemBroadcastPickerView,解决了录制画面,用户无需在控制中心手动启动。

摘要

结合以上对各种iOS系统版本录屏限制的分析,从版本稳定性和发布可靠性的角度来看,应该从iOS12系统开始提供录屏功能,而之前的系统版本并不兼容。如果只录制app页面进行直播,那么系统可以兼容iOS 9。

四。屏幕共享的注意事项

由于iOS手机屏幕分辨率较高,考虑到内存占用和传输效率,需要对图像采集和处理过程进行优化,分辨率一般限制在720P。

扩展子进程的内存限制为50M。当这个线程中的内存超过50M时,程序就会崩溃。因为这个限制,业内类似的处理方案都会将其视频质量限制在不超过720P,高端机型视频针数保持在30以内,低端机型视频帧率保持在10以内。

子进程崩溃会导致页面一直播放提示框,用户只能重启手机解决问题。

子进程与宿主app通信时,需要根据传输的内容选择不同的形式:1。通过配置应用程序组共享文件或用户默认值。2.进程间通知:CFNotificationCenter、一般打开和关闭等。可以通过通知实现。3.通过Socket传输,屏幕共享这样的场景更适合这个。

动词 (verb的缩写)anyRTC屏幕共享的实现

AnyRTC视频屏幕共享可以通过两种方式实现:

一种是在扩展子进程中通过Socket传输将屏幕共享视频数据发送给主机app,主机app通过自收推送将流插入SDK,只能传输一个视频流,可以是屏幕共享,也可以是摄像头视频流。

一种是在扩展子流程中初始化SDK,拉流设置为不订阅别人的音视频,做发送方。该 *** 实现了一个客户端可以只通过两个uid进入同一个通道的形式发送自己摄像头的视频流或屏幕共享的流。

本地套接字被传输到主机应用程序。

创意:博客

大致思路是:在本地设置一个socket,以tcp的形式传输到主机app,在主机app中进行复杂的操作,从而有效解决了扩展50M的限制问题。

在子流程中直接使用SDK

思路:在扩展中直接使用SDK,只发送流,不接收流。同时也要注意扩展50M的问题(1:应用限制了横屏和竖屏的直播,横屏和竖屏都可以,横屏和竖屏切换的应用容易导致内存突然增加。2:低性能机器限制视频的帧率(1~10帧))

1.初始化

将频道属性设置为直播模式,设置为主播角色,启用视频模块。

//实例化rtc对象rtcKit=[ARtcEngineKitsharedEngineWithAppId:appIddelegate:self];[rtcKitsetChannelProfile:ARChannelProfileLiveBroadcasting];[rtcKitsetClientRole:ARClientRoleBroadcaster];[rtcKitenableVideo];

2.设定屏幕共享的分辨率。

由于子流程中有50M的限制,为了系统的稳定性,建议分辨率不要超过720P。

根据屏幕的宽度和高度,用分辨率换算,计算出更佳分辨率输出。

视频的帧率,如果在低端机型,建议设置5帧,高端机不要超过30帧。

分享一下屏幕的清晰度,可以适当调整码率,建议不要超过1800。

//获取当前屏幕的更佳分辨率CGSizescreenSize=[[UIScreenmainScreen]currentMode].size;CGSizeboundingSize=CGSizeMake(720,1280);CGFloatmW=boundingSize.width/screenSize.width;CGFloatmH=boundingSize.height/screenSize.height;if(mH

3.设置外部音频和视频源。

将外接视频源设置为抓拍,内接抓拍开启后会自动关闭。

设置外部音源采集,内部音频采集开启后会自动关闭。

//配置外部视频源[rtcKitsetExternalVideoSource:YESuseTexture:YESpushMode:YES];//推送外部音频帧[rtcKitenableExternalAudioSourceWithSampleRate:48000channelsPerFrame:2];

4.禁止接收音频和视频。

作为屏幕共享端,只需要发送stream,不需要接收stream。

//禁止接收所有音视频流[rtcKitmuteAllRemoteVideoStreams:YES];[rtcKitmuteAllRemoteAudioStreams:YES];

5.加入频道

在主机app中获取用户Id,组装成图层,标记为某人的辅助流量。

获取主机app中正在使用的频道Id,启动屏幕共享时以用户辅助流的形式进入频道。

//获取hostapp中的用户Id,在进行一层组装,标记为某个人的辅流NSString*uid=[NSStringstringWithFormat:@"%@_sub",self.userId];//加入频道[rtcKitjoinChannelByToken:nilchannelId:self.channelIduid:uidjoinSuccess:^(NSString*_Nonnullchannel,NSString*_Nonnulluid,NSIntegerelapsed){NSLog(@"joinSuccess");}];

6.头发流动

RPSampleBufferTypeVideo:获取视频数据,使用外部的plug-flow接口发送出去。

RPSampleBufferTypeAudioApp:获取应用中的音源,使用外部的plug-flow接口发送音频数据。

RPSampleBufferTypeAudioMic:获取麦克风音源,使用外部的plug-flow接口发送音频数据。

视频拥塞需要视频数据的组装,如视频类型、时间戳和旋转角度。

-(void)processSampleBuffer:(CMSampleBufferRef)sampleBufferwithType:(RPSampleBufferType)sampleBufferType{switch(sampleBufferType){caseRPSampleBufferTypeVideo:{//处理视频数据CVPixelBufferRefpixelBuffer=CMSampleBufferGetImageBuffer(sampleBuffer);if(pixelBuffer){&nbsp友优资源网;CMTimetimestamp=CMSampleBufferGetPresentationTimeStamp(sampleBuffer);ARVideoFrame*videoFrame=[[ARVideoFramealloc]init];videoFrame.format=12;videoFrame.time=timestamp;videoFrame.textureBuf=pixelBuffer;videoFrame.rotation=[selfgetRotateByBuffer:sampleBuffer];[rtcKitpushExternalVideoFrame:videoFrame];}}break;caseRPSampleBufferTypeAudioApp://处理音频数据,音频由App产生[rtcKitpushExternalAudioFrameSampleBuffer:sampleBuffertype:ARAudioTypeApp];break;caseRPSampleBufferTypeAudioMic:友优资源网//处理音频数据,音频由麦克风产生[rtcKitpushExternalAudioFrameSampleBuffer:sampleBuffertype:ARAudioTypeMic];break;default:break;}}

通过以上步骤,可以实现屏幕共享功能。为了方便开发者更快上手,可以参考demo快速上手。

IOS屏幕共享

Android屏幕共享

  • 发表于 2022-12-18 15:41:41
  • 阅读 ( 194 )
  • 分类:科技

0 条评论

请先 登录 后评论
刘志远
刘志远

332 篇文章

你可能感兴趣的文章

相关问题