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

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

一.概述

直播过程 *** 享屏幕有两个步骤:屏幕数据采集和流媒体数据推送。对于iOS,屏幕截图需要系统的许可。由于iOS系统的限制,面进行直播,那么系统可以兼容iOS 9。

四.屏幕共享的注意事项。

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

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

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

子进程和主机应用程序之间的通信根据传输的内容需要不同的形式:1。共享文件或用户默认情况下,通过配置应用程序组。2.进程间通知:CFNotificationCenter,一般可以通过通知打开和关闭。3.通过Socket传输,屏幕共享这样的场景更适合这样。

anyRTC屏幕共享的实现。

有两种 *** 可以共享anyRTC视频屏幕:

一种是通过Extension子流程中的Socket传输将屏幕共享视频数据发送给主机app,主机app以自采集Push的方式将流插入SDK,只能传输所有的视频流,要么是屏幕共享,要么是摄像头的视频流。

一种是在Extension子流程中初始化SDK,拉流设置为不订阅别人的音视频,只做发送方。这样,客户端可以发送自己相机的视频流或屏幕共享的流,只是以两个uid进入同一个频道的形式。

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

思维参考:博客。

总体思路是:在本地建立一个名为s红豆的博客,以tcp的形式传输给宿主app。在主机app中进行复杂操作,有效解决了Extension 50M的限制。

SDK直接在子进程中使用。

想法:在Extension中直接使用SDK,只发送流,不接收流。同时也要注意Extension 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 mW){boundingSize.width=boundingSize.height/screenSize.height*screenSize.width;}elseif(mW mH){boundingSize.height=boundingSize.width/screenSize.width*screenSize.height;}//视频编码配置ARVideoEncoderConfiguration*config=[[ARVideoEncoderConfigurationalloc]init];config.dimensions=boundingSize;config.bitrate=1500;config.frameRate=10;config.orientationMode=ARVideoOutputOrientationModeAdaptative;[rtcKitsetVideoEncoderConfiguration:config];3.设置和使用外部音频和视频源。

将外部视频源设置为采集,打开时,内部采 *** 自动关闭。

设置为使用外部音频源采集,打开时,内部音频采 *** 自动关闭。

//配置外部视频源[rtcKitsetExternalVideoSource:YESuseTexture:YESpushMode:YES];//推送外部音频帧[rtcKitenableExternalAudioSourceWithSampleRate:48000channelsPerFrame:2];4.禁止接收音频和视频。

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

//禁止接收所有音视频流[rtcKitmuteAllRemoteVideoStreams:YES];[rtcKitmuteAllRemoteAudioStreams:YES];5.加入频道。

在主机应用中获取用户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:获取视频数据,并使用外部插件流接口将其发送出去。

RPSampleBufferTypeAudioApp:在应用中获取音源,使用外部的插件流接口将音频数据发送出去。

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

视频分块需要组装视频数据、视频类型、时间戳、旋转角度等信息。

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

完成上述步骤后,即可实现屏幕共享功能。为了方便开发者快速入门,可以参考demo快速入门。

IOS屏幕共享

安卓屏幕共享。