ReplayKit 的屏幕录制功能

苹果在 iOS 9 中新添加了 ReplayKit 库,主要作用就是 RPScreenRecorder 的屏幕录制功能。在 iOS 10 中,苹果又为 ReplayKit 添加了RPBroadcast 相关的类,主要用于视频直播。这篇文章说的是屏幕录制,以后可以研究一下苹果官方推出的的直播,还是蛮期待的。

关于屏幕录制的功能很简单,只涉及了三个类 RPScreenRecorder 、RPPreviewViewController 和 RPError。

相关的方法都在 RPScreenRecorder 里:

开始录制 :开始录制有两个方法


- (void)startRecordingWithHandler:(nullable void(^)(NSError * _Nullable error))handler;



- (void)startRecordingWithMicrophoneEnabled:(BOOL)microphoneEnabled handler:(nullable void(^)(NSError * _Nullable error))handler;

调用第一个的作用只能录制屏幕的画面,无法录制声音。点击后会有授权信息,如图:

ReplayKit 的屏幕录制功能_第1张图片

调用第二个方法会传递 microphoneEnabled 的布尔值,
如果设置为 NO ,效果和作用和调用第一个方法无异。如果设置为 YES ,会弹出如下授权信息:

ReplayKit 的屏幕录制功能_第2张图片

注:选择了第一个,会在录制屏幕画面的同时,会录制手机以及外部环境的声音。

结束录制

- (void)stopRecordingWithHandler:(nullable void(^)(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error))handler;

结束录制后,会有一个回调,返回一个 previewViewController 。该 ViewController 包含了录制好的视频预览图,顶部的返回和保存,以及底部的分享。 一般,我们只需要 present 出这个 ViewController。然后,点击保存就会自动存入相册 。也可以点击分享,直接分享到一些第三方。

代理方法
RPScreenRecorderDelegate

1、如果在录制的过程中,因为一些意外终止了录制,会调用这个方法,可以再此获取错误信息。(第一个方法在 iOS11 中已经被废弃调,可以用第二个方法)

- (void)screenRecorder:(RPScreenRecorder *)screenRecorder didStopRecordingWithError:(NSError *)error previewViewController:(nullable RPPreviewViewController *)previewViewController;

- (void)screenRecorder:(RPScreenRecorder *)screenRecorder didStopRecordingWithPreviewViewController:(nullable RPPreviewViewController *)previewViewController error:(nullable NSError *)error;

2、下面这个代理方法是用来监听 ReplayKit 是否可用的,如果状态发生变化(比如录制过程中,切入设置,关闭权限。)会回调该方法。

- (void)screenRecorderDidChangeAvailability:(RPScreenRecorder *)screenRecorder;

注意事项

1、我们是无法通过回调直接拿到视频文件的,只有等待存入相册后,我们再从相册读取。

2、点击开始录制的时候,到系统真正的开始录制会有大概 1-2s 的延迟,甚至会出现启动录制失败的现象。因此要做好提示处理。


另外,在 iOS11中 我们可以通过下面的方法获取屏幕录制的每一帧:

- (void)startCaptureWithHandler:(nullable void(^)(CMSampleBufferRef sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error))captureHandler completionHandler:(nullable void(^)(NSError * _Nullable error))completionHandler API_AVAILABLE(ios(11.0), tvos(11.0));

该方法在准备完毕后调用 completionHandler,然后 在录制过程中,会不断回调 captureHandler ,我们可以通过返回的每一个 sampleBuffer ,获取到视频对应的每一帧图片。具体转换方法谷歌一下,很多。

当然,有开始就有停止:

- (void)stopCaptureWithHandler:(nullable void(^)(NSError * _Nullable error))handler API_AVAILABLE(ios(11.0), tvos(11.0));

我觉得 iOS11 这个获取每帧画面应该就是为了直播准备的。关于苹果官方的直播方案,下次再议。

你可能感兴趣的:(iOS,屏幕录制,获取视频帧,直播)