目录
- 不同系统版本的演进
这里只以ios为例,以后有时间会分别写一下其它平台上的实现方式。
苹果在这方面一直处于消极缓慢的演进状态,总是令开发者有点巧妇难为的感觉。即使是给出的实现方案,也因为各种不稳定,在实际调用过程中不能稳定执行。后面也会一一说明。
ios中比较正规的实现方式是用Extension来实现的,从ios9开始提供很有限的实现。在ios9之前也有通过破解协议来实现的,本文是以Extension扩展方式实现,如何添加扩展我就不一一说明了。
1. RPScreenRecorder
RPScreenRecorder是苹果最早提出的屏幕录制方案,直接上部分代码:
/*
* 直接触发录屏,只能录取应该应用中的内容,应用进入后台或退出后,自动关闭。
*/
#pragma mark- start record
-(IBAction)onStart:(id)sender{
if([[RPScreenRecorder sharedRecorder] isAvailable] == YES){
[[RPScreenRecorder sharedRecorder] startRecordingWithMicrophoneEnabled:YES handler:^(NSError * _Nullable error) {
}];
}
}
#pragma mark- stop record
- (IBAction)onStop:(id)sender{
if([[RPScreenRecorder sharedRecorder] isAvailable] == YES){
[[RPScreenRecorder sharedRecorder]stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error) {
[self presentViewController:previewViewController animated:YES completion:^{
}];
}];
}
}
上面这种方式当点击完成后,会模态打开系统提供的预览界面。在界面中可以选择保存共享等方式。显示然这种方式是不支持流式实时返回的,做直播显然不太合适,主要用于后期生成完整文件再上传的方式。
于是,在 ios11有时候,苹果又在这个基础上提供了一定的实时流返回的能力,但其实这个时候,已经可以不用这个方式实现了,这时大概提供一下调用方法:
// 开始录制
if (@available(iOS 11.0, *)) {
[[RPScreenRecorder sharedRecorder] startCaptureWithHandler:^(CMSampleBufferRef _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error) {
NSLog(@"--- [数据] %@", sampleBuffer);