使用案例
我正在使用iOS 11 Replaykit框架尝试从屏幕录制帧,以及来自应用和麦克风的音频。
问题
随机地,当我调用我的.append(sampleBuffer)时AVAssetWriterStatus.failed
显示<{1}}
AssetWriter.Error
侧面问题:我在应用程序录制时播放重复声音以尝试验证录制的音频,但是当我开始录制时声音停止,即使我在视频和外部音频麦克风工作的地方也是如此。
如果您需要更多信息,我也可以将其他代码上传到GitHub。
观
因为有时录音会保存(我可以导出到照片应用并播放视频)我认为必须是异步问题,而我正在按顺序加载内容。如果你看到任何内容,请告诉我。
我想要的一个想法是保存到/ Documents中我自己的文件夹,而不是直接到/ Documents,以防出现奇怪的权限错误。虽然我认为这会导致一致的错误,而不仅仅是有时会破坏。
我的代码
Error Domain=AVFoundationErrorDomain Code=-11823 "Cannot Save" UserInfo={NSLocalizedRecoverySuggestion=Try saving again., NSLocalizedDescription=Cannot Save, NSUnderlyingError=0x1c044c360 {Error Domain=NSOSStatusErrorDomain Code=-12412 "(null)"}}
答案 0 :(得分:0)
我有类似的问题。我通过首先检查videoURL文件是否已经存在来修复它。如果是这样,先将其删除,然后错误就会消失。
答案 1 :(得分:0)
我得到了它的工作。我相信这确实是一个异步问题。问题,出于某种原因,你必须确保
assetWriter.startWriting()
assetWriter.startSession(atSourceTime: CMSampleBufferGetPresentationTimeStamp(sampleBuffer))
严格按顺序发生。
从此处更改您的代码:
if assetWriter.status == AVAssetWriterStatus.unknown {
print("AVAssetWriterStatus.unknown")
if !assetWriter.startWriting() {
return
}
assetWriter.startSession(atSourceTime: CMSampleBufferGetPresentationTimeStamp(sampleBuffer))
}
到此:
DispatchQueue.main.async { [weak self] in
if self?.assetWriter.status == AVAssetWriterStatus.unknown {
print("AVAssetWriterStatus.unknown")
if !self?.assetWriter.startWriting() {
return
}
self?.assetWriter.startSession(atSourceTime: CMSampleBufferGetPresentationTimeStamp(sampleBuffer))
}
}
甚至更好,CMSampleBufferDataIsReady
内的整个区块即
if CMSampleBufferDataIsReady(sampleBuffer) {
DispatchQueue.main.async { [weak self] in
...
...
}
}
让我知道它是否有效!