Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios RPScreenRecorder.shared().isAvailable始终为false_Ios_Swift - Fatal编程技术网

Ios RPScreenRecorder.shared().isAvailable始终为false

Ios RPScreenRecorder.shared().isAvailable始终为false,ios,swift,Ios,Swift,我正在尝试使用ios应用程序示例录制屏幕。 但它不起作用,因为RPScreen.shared().isAvailable总是返回false。 这是我的密码: ViewController.swift 导入UIKit 类ViewController:UIViewController{ @IBVAR启动录制按钮:UIButton! @IBV弱var EndRecordingButton:UIButton! 重写func viewDidLoad(){ super.viewDidLoad() //加载视

我正在尝试使用ios应用程序示例录制屏幕。
但它不起作用,因为
RPScreen.shared().isAvailable
总是返回false。
这是我的密码:

ViewController.swift

导入UIKit
类ViewController:UIViewController{
@IBVAR启动录制按钮:UIButton!
@IBV弱var EndRecordingButton:UIButton!
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后执行任何其他设置。
StartRecordingButton.addTarget(self,action:#选择器(startRecord(:)),for:.touchUpInside)
EndRecordingButton.addTarget(self,action:#选择器(stopRecord(:)),for:.touchUpInside)
}
private lazy var recorder:ScreenRecorder=ScreenRecorder(配置:ScreenRecorder.configuration(),完成:{
(url,错误)在
guard let url=url else{
fatalError(\(\函数)记录失败\(字符串(描述:错误)))
}
debugPrint(#函数,“success”,url)
})
@objc func起始记录(uu发送方:UIButton){
recordStart()
}
@objc func停止记录(\发送方:UIButton){
recordStop()
}
private func recordStart(){
guard!recorder.isRecording else{return}
做{
试试recorder.start()
}抓住{
fatalError(“开始录制失败\(错误)”)
}
}
私有函数记录停止(){
guard recorder.isRecording else{return}
做{
试试录音机。结束()
}抓住{
fatalError(“完成录制失败\(错误)”)
}
}
}
斯威夫特

import-ReplayKit
@可用(iOS 11.0,*)
公共类ScreenRecorder:NSObject{
让screenRecorder=RPScreenRecorder.shared()
//参数的别名
公共类型别名完成=(URL?,错误?)->()
完成:完成
let配置:配置
公共初始化(配置:配置,完成:@转义完成){
self.configuration=配置
自我完成=完成
super.init()
}
//开始录制屏幕
public func start()抛出{
打印(screenRecorder.i可用)
guard screenRecorder.i其他可用{
抛出ScreenRecorder错误。不可用
}
守卫!屏幕记录器。正在记录其他内容{
抛出ScreenRecorderError.alreadyRunning
}
尝试安装()
assetWriter?.startWriting()
assetWriter?.startSession(atSourceTime:CMTime.zero)
screenRecorder.startCapture(处理程序:{[weak self](cmSampleBuffer,rpSampleBufferType,error)位于
如果let error=error{
debugPrint(#函数,“发生了什么事”,错误)
}
如果RPSampleBufferType.video==RPSampleBufferType{
self?.appendVideo(sampleBuffer:cmSampleBuffer)
}
}){[弱自我](错误)在
如果let error=error{
自我?完成(无,错误)
}
}
}
public func end()抛出{
guard screenRecorder.i记录其他内容{
抛出ScreenRecorder错误。未运行
}
screenRecorder.stopCapture{[弱自身](错误)位于
如果let error=error{
自我?完成(无,错误)
}
self?.videoAssetWriterInput?.markAsFinished()
self?assetWriter?完成写作{
DispatchQueue.main.async{
self?.completion(self?.cacheFileURL,无)
}
}
}
}
公共变量记录:Bool{
返回screenRecorder.isRecording
}
私人var开始时间:CMTime?
私人var assetWriter:AVAssetWriter?
私有var videoAssetWriterInput:AVAssetWriterInput?
私有变量writerInputPixelBufferAdapter:AvassetWriterInputPixelBufferAdapter?
private func setUp()抛出{
请尝试CreateCacheDirectoryIfRequired()
请尝试删除旧缓存文件()
guard let cacheURL=cacheFileURL else{
抛出ScreenRecorderError.invalidURL
}
让assetWriter=尝试AVAssetWriter(url:cacheURL,文件类型:configuration.fileType)
let videoSettings:[字符串:任意]=[
AVVideoCodeKey:configuration.codec,
AVVideoWidthKey:UInt(配置.videoSize.width),
AVVideoHeightKey:UInt(配置.视频大小.高度),
]
let videoAssetWriterInput=尝试AVAssetWriterInput(媒体类型:。视频,输出设置:视频设置)
videoAssetWriterInput.expectsMediaDataInRealTime=true
如果assetWriter.canAdd(视频AssetWriterInput){
assetWriter.add(视频AssetWriterInput)
}
self.assetWriter=assetWriter
self.videoAssetWriterInput=videoAssetWriterInput
self.writerInputPixelBufferAdapter=AvassetWriterInputPixelBufferAdapter(assetWriterInput:videoAssetWriterInput,sourcePixelBufferAttributes:[
kCVPixelBufferPixelFormatTypeKey作为字符串:Int(kCVPixelFormatType_32ARGB)
])
}
专用func appendVideo(sampleBuffer:CMSampleBuffer){
guard let pixelBuffer=CMSampleBufferGetImageBuffer(sampleBuffer)else{return}
让我们第一次:CMTime
如果让startTime=self.startTime{
第一次=开始时间
}否则{
firstTime=CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
开始时间=第一次
}
让currentTime:CMTime=CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
让diffTime:CMTime=CMTimeSubtract(currentTime,firstTime)
如果writerInputPixelBufferAdapter?.assetWriterInput.isReadyForMoreMediaData?错误{
writerInputPixelBufferAdapter?.append(pixelBuffer,withPresentationTime:diffTime)
}
}
private func createCacheDirectoryIfRequired()抛出{
guard let cacheDirectoryURL=cacheDirectoryURL else{return}
让fileManager=fileManager.default
guard!fileManager.fileExists(atPath:cacheDirectoryURL.path)else{return}
请尝试fileManager.createDirectory(位于:cacheDirectoryURL,带中间目录:true,属性:nil)
}
private func removeOldCachedFile()抛出{
guard let cacheURL=cacheFileURL else{return}
让fileManager=fileManager.default
guard fileManager.fileExists(atPath:cacheURL.path)else{return}
ios_record_screen[1258:213516] Fatal error: start recording failed notAvailable