昨天WonderParade把Ocean Adventure全部WFC了,然后想到录屏的时候,想起之前研究过的Quicktime录屏,在想能不能设备上录制
google之后搜到了ReplayKit,看起来非常简单的样子
最初尝试直接cycript执行,载入Framework之后虽然可以调用到开始和停止录制,但是因为cycript里的函数不是objc的方法,所以没办法搞回调
于是找了示例项目,粗略编了一个MS插件,作用仅仅就是声明一个ReplayKitObj类,代替调用开始/停止录制
毕竟也不熟练,怼了一阵搞出来一个能工作的版本,但是真正搞出来之后发现,ReplayKit录制质量特别渣……
基本上来讲,qt录制质量是100的话,airplay录制大概是85,rk就是60-70的样子…而且音频只录制了一个声道,这是最骚的
// // ReplayKitObj.mm // ReplayKitObj // // Created by ester on 2017/12/12. // Copyright (c) 2017年 __MyCompanyName__. All rights reserved. // // CaptainHook by Ryan Petrich // see https://github.com/rpetrich/CaptainHook/ #if TARGET_OS_SIMULATOR #error Do not support the simulator, please use the real iPhone Device. #endif #import <Foundation/Foundation.h> // Objective-C runtime hooking using CaptainHook: // 1. declare class using CHDeclareClass() // 2. load class using CHLoadClass() or CHLoadLateClass() in CHConstructor // 3. hook method using CHOptimizedMethod() // 4. register hook using CHHook() in CHConstructor // 5. (optionally) call old method using CHSuper() #import <ReplayKit/ReplayKit.h> @interface ReplayKitObj : UIViewController //@interface ReplayKitObj : NSObject<RPPreviewViewControllerDelegate, RPScreenRecorderDelegate> //@interface ReplayKitObj : UIViewController<RPPreviewViewControllerDelegate, RPScreenRecorderDelegate> //-(void)startRec; //-(void)stopRec; //- (void)previewControllerDidFinish; @end //@interface ReplayKitObj () <RPPreviewViewControllerDelegate> //@end @implementation ReplayKitObj +(void)startRec{ NSLog(@"enter"); //UIViewController* rootController = [UIApplication sharedApplication].keyWindow.rootViewController; RPScreenRecorder* recorder = RPScreenRecorder.sharedRecorder; [recorder startRecordingWithMicrophoneEnabled:false handler:^(NSError * error) { if(error != nil) { NSString* desc = error.description; NSLog(@"%@", desc); return; } }]; } +(void)stopRec{ NSLog(@"enter"); [[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController * _Nullable previewViewController, NSError * _Nullable error){ NSLog(@"EEEEE"); if(error){ NSLog(@"fialed to stop recording, %@", error); }else if(previewViewController != nil){ NSLog(@"finish"); previewViewController.previewControllerDelegate = self; UIViewController *rootController = [UIApplication sharedApplication].keyWindow.rootViewController; [rootController presentViewController:previewViewController animated:YES completion:nil]; } }]; NSLog(@"end"); } +(void)previewControllerDidFinish:(RPPreviewViewController *)previewController { NSLog(@"previewControllerDidFinish"); [[UIApplication sharedApplication].keyWindow.rootViewController dismissViewControllerAnimated:YES completion:nil]; } +(void)previewController:(RPPreviewViewController *)previewController didFinishWithActivityTypes:(NSSet <NSString *>*)activityTypes { NSLog(@"activity - %@",activityTypes); } @end
总之,本来还在想要不要开发一个完整插件出来,但这么差的录制质量,还是算了