import ReplayKit
开始录制。录制时使用麦克风和摄像头功能在 Info.plist
文件添加字段 NSCameraUsageDescription
let recorder = RPScreenRecorder.shared()
guard //录屏是否可用
recorder.isAvailable &&
//是否正在录屏
!recorder.isRecording else { return }
//录屏时是否启用麦克风。默认false
recorder.isMicrophoneEnabled = true
//录屏时是否启用摄像机。默认false
recorder.isCameraEnabled = true
//录屏启用摄像机时前后摄像头选择
recorder.cameraPosition = .front
recorder.startRecording { (error) in
//前置或后置摄像头内容的UIView,有默认的frame,也可重新设置frame
if let previewView = self.recorder.cameraPreviewView {
previewView.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
self.view.addSubview(previewView)
}
}
停止录制。给定地址,录制完成后保存到沙盒内。如果给定的视频地址已存在视频文件,则录制完成后会保存失败。所以每次视频地址需要更换保证不能重复,或者录制完成后移走视频到另外的文件夹。
已存在文件保存时的报错信息
▿ Optional<Error>
- some : Error Domain=com.apple.ReplayKit.RPRecordingErrorDomain Code=-5812 "RECORDING_ERROR_FAILED_TO_SAVE" UserInfo={NSLocalizedDescription=RECORDING_ERROR_FAILED_TO_SAVE}
let path = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first! + "/video.mp4"
let url = URL(fileURLWithPath: path)
RPScreenRecorder.shared().stopRecording(withOutput: url) { (error) in
if FileManager.default.fileExists(atPath: path) {
DispatchQueue.main.async {
// import AVKit
let player = AVPlayerViewController()
player.player = AVPlayer(url: url)
self.present(player, animated: true, completion: nil)
}
}
}
停止录制。录制完成后返回 RPPreviewViewController
,RPPreviewViewController
预览控制器包含一个 取消
按钮和一个 存储
按钮,存储到手机相册。
RPScreenRecorder.shared().stopRecording { (previewViewController, error) in
self.present(previewViewController!, animated: true, completion: nil)
}
开始录制。录制过程中持续返回的 CMSampleBuffer
可对录制视频进行更多操作。
RPScreenRecorder.shared().startCapture { (sampleBuffer, sampleBufferType, error) in
} completionHandler: { (error) in
}
CMSampleBuffer
CMSampleBuffer 0x135305790 retainCount: 8 allocator: 0x1ddb10660
invalid = NO
dataReady = YES
makeDataReadyCallback = 0x0
makeDataReadyRefcon = 0x0
formatDescription = <CMAudioFormatDescription 0x282904280 [0x1ddb10660]> {
mediaType:'soun'
mediaSubType:'lpcm'
mediaSpecific: {
ASBD: {
mSampleRate: 44100.000000
mFormatID: 'lpcm'
mFormatFlags: 0xe
mBytesPerPacket: 4
mFramesPerPacket: 1
mBytesPerFrame: 4
mChannelsPerFrame: 2
mBitsPerChannel: 16 }
cookie: {(null)}
ACL: {(null)}
FormatList Array: {
Index: 0
ChannelLayoutTag: 0x650002
ASBD: {
mSampleRate: 44100.000000
mFormatID: 'lpcm'
mFormatFlags: 0xe
mBytesPerPacket: 4
mFramesPerPacket: 1
mBytesPerFrame: 4
mChannelsPerFrame: 2
mBitsPerChannel: 16 }}
}
extensions: {(null)}
}
sbufToTrackReadiness = 0x0
numSamples = 1024
outputPTS = {708862616580125/1000000000 = 708862.617}(based on cachedOutputPresentationTimeStamp)
sampleTimingArray[1] = {
{PTS = {708862616580125/1000000000 = 708862.617}, DTS = {INVALID}, duration = {1/44100 = 0.000}},
}
dataBuffer = 0x282a18240
停止录制
RPScreenRecorder.shared().stopCapture { (error) in
}
网友评论