怎么在IOS上使用ReplayKit与清债信托公司

  介绍

小编给大家分享一下怎么在IOS上使用ReplayKit与RTC,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

直播场景下的屏幕分享,不仅要将当前显示器所展示的画面分享给远端,也要将声音传输出去,包括应用的声音,以及主播的声音。鉴于这两点需求,我们可以简单分析出,进行一次屏幕分享的直播所需要的媒体流如下:

<李>

一条显示器画面的视频流

<李>

一条应用声音的音频流

<李>

一条主播声音的音频流

ReplayKit是苹果提供的用于IOS系统进行屏幕录制的框架。

首先我们来看看苹果提供的用于屏幕录制的ReplayKit的数据回调接口:

override  func  processSampleBuffer (_  sampleBuffer:, CMSampleBuffer,, with  sampleBufferType:, RPSampleBufferType), {   ,,,,,,,DispatchQueue.main.async  {   ,,,,,,,,,,,switch  sampleBufferType  {   ,,,,,,,,,,,case  .video:   ,,,,,,,,,,,,,,,AgoraUploader.sendVideoBuffer (sampleBuffer)   ,,,,,,,,,,,case  .audioApp:   ,,,,,,,,,,,,,,,AgoraUploader.sendAudioAppBuffer (sampleBuffer)   ,,,,,,,,,,,case  .audioMic:   ,,,,,,,,,,,,,,,AgoraUploader.sendAudioMicBuffer (sampleBuffer)   ,,,,,,,,,,,@unknown 默认值:   ,,,,,,,,,,,,,,,休息   ,,,,,,,,,,,}   ,,,,,,,}   ,,,}

从枚举sampleBufferType上,我们不难看出,刚好能符合我们上述对媒体流的需求。

视频格式

guard  let  videoFrame =, CMSampleBufferGetImageBuffer (sampleBuffer), else  {   ,才能返回   }   ,,,,,,,   let  type =, CVPixelBufferGetPixelFormatType (videoFrame) type =, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange

通过,<强> CVPixelBufferGetPixelFormatType 强,我们可以获取到每帧的视频格式为,<强> yuv420

帧率

通过打印接口的回调次数,可以知道每秒能够获取的视频帧为30次,也就是帧率为30。

格式与帧率都能符合集市RTC所能接收的范围,所以通过集市RTC的,<强> pushExternalVideoFrame ,就可以将视频分享到远端了。

agoraKit.pushExternalVideoFrame(帧)

插入一个小知识

显示器所显示的帧来自于一个帧缓存区,一般常见的为双缓存或三缓存。当屏幕显示完一帧后,发出一个垂直同步信号(V-Sync),告诉帧缓存区切换到下一帧的缓存上,然后显示器开始读取新的一帧数据做显示。

这个帧缓存区是系统级别的,一般的开发者是无法读取跟写入的。但是如果是苹果自身提供的录制框架ReplayKit能够直接读取到已经渲染好且将用于显示器的帧,且这一过程不会影响渲染流程而造成掉帧,那就能减少一次用于提供给ReplayKit回调数据的渲染过程。

音频

ReplayKit能提供的音频有两种,分为麦克风录制进来的音频流,与当前响应的应用播放的音频流。(下文将前者称为AudioMic,后者为AudioApp)

可以通过下面的两行代码,来获取音频格式

CMAudioFormatDescriptionRef  format =, CMSampleBufferGetFormatDescription (sampleBuffer);   const  AudioStreamBasicDescription  * description =, CMAudioFormatDescriptionGetStreamBasicDescription(格式),

AudioApp

AudioApp会在不同的机型下有不一样的声道数例。如在iPad或iPhone7以下机型中,不具备双声道播放的设备,这时候AudioApp的数据就是单声道,反之则是双声道。

采样率在部分试过的机型里,都是44100,但不排除在未测试过的机型会是其他的采样率。

AudioMic

AudioMic在测试过的机型里,采样率为32000,声道数为单声道。

音频前处理

如果我们将AudioApp与AudioMic作为两条音频流去发送,那么流量肯定是大于一条音频流的。我们为了节省一条音频流的流量,就需要将这两条音频流做混音(融合)。

但是通过上述,我们不难看出,两条音频流的格式是不一样的,而且不能保证随着机型的不同,是不是会出现其他的格式。在测试的过程中还发现OS版本的不同,每次回调给到的音频数据长度也会出现变化。那么我们在对两条音频流做混音前,就需要进行格式统一,来应对ReplayKit给出的各种格式,所以我们采取了以下几个重要的步骤:

if  (==channels  1), {   ,,,int16_t *, intData =, (int16_t *)数据;   ,,,int16_t  newBuffer (totalSamples  *, 2);   ,,,,,,,,,,,   ,,,for  (int 小姐:=,0;,小姐:& lt;, totalSamples;,我+ +),{   ,,,,,,,newBuffer(2, *,我),=,intData[我];   ,,,,,,,newBuffer(2, *,小姐:+,1],=,intData[我];   ,,,}   ,,,totalSamples  *=, 2;   ,,,memcpy(数据,newBuffer,, sizeof (int16_t), *, totalSamples);   ,,,totalBytes  *=, 2;   ,,,channels =, 2;   }

怎么在IOS上使用ReplayKit与清债信托公司