美文网首页
iOS 屏幕录制

iOS 屏幕录制

作者: gaookey | 来源:发表于2020-11-03 13:35 被阅读0次
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)
        }
    }
}

停止录制。录制完成后返回 RPPreviewViewControllerRPPreviewViewController 预览控制器包含一个 取消 按钮和一个 存储 按钮,存储到手机相册。

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
    
}

相关文章

网友评论

      本文标题:iOS 屏幕录制

      本文链接:https://www.haomeiwen.com/subject/taybvktx.html