我正在手动编写录像机。不幸的是,如果您想同时录制视频并使用ARKit,则很有必要。我已经弄清楚了大部分内容,但是现在我需要对其进行一些优化,因为我的手机同时运行ARKit,Vision和此录音机变得非常热。
要制作记录器,您需要将AVAssetWriter
与AVAssetWriterInput
(和AVAssetWriterInputPixelBufferAdaptor
)一起使用。输入具有isReadyForMoreMediaData
属性,您需要先检查该属性,然后才能编写另一个框架。我正在实时录制(或尽可能接近)。
现在,当ARKit.ARSession
给我一个新会话时,我立即将其传递给AVAssetWriterInput
。我要做的是将其添加到队列中,并进行循环检查,以查看是否有可编写的示例。对于我的一生,我无法弄清楚如何有效地做到这一点。
我只想像这样运行一个while循环,但这似乎不是一个好主意:
func startSession() {
// …
while isRunning {
guard !pixelBuffers.isEmpty && writerInput.isReadyForMoreMediaData else {
continue
}
// process sample
}
}
我可以在ARSession.delegateQueue
之外的其他线程中运行此线程吗?我不想因为相机被保留太长时间而遇到CVPixelBuffer
的问题。