Replaykit资产编写者状态随机失败

时间:2017-10-16 15:49:51

标签: ios swift avfoundation ios11 replaykit

使用案例

我正在使用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)"}}

2 个答案:

答案 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
        ...
        ...
    }
}

让我知道它是否有效!