( AVCaptureSession, "" 3D- SCNNodes), ARFrame.capturedImage updateAtTime SCNSceneRenderer:
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
createMovieWriterOnce(frame: session.currentFrame)
appendFrameWithMetadaToMovie(frame: session.currentFrame)
}
ARSession, MovieWriter :
func createMovieWriterOnce(frame: ARFrame?) {
if(frame == nil) { return }
DispatchQueue.once(token: "SimplestMovieWriter.constructor") {
movieWriter = SimplestMovieWriter(frameWidth: CVPixelBufferGetWidth(frame!.capturedImage), frameHeight: CVPixelBufferGetHeight(frame!.capturedImage))
}
}
CVPixelBuffer MovieWriter:
func appendFrameWithMetadaToMovie(frame: ARFrame?) {
if(!isVideoRecording || frame == nil) { return }
let interestingPoints = frame?.rawFeaturePoints?.points
movieWriter.appendBuffer(buffer: (frame?.capturedImage)!, withMetadata: interestingPoints)
}
MovieWriter - AVAssetWriter, AVAssetWriterInput AVAssetWriterInputPixelBufferAdaptor.
, AVAssetExportSession, (, , ):
let composition = AVMutableComposition()
...
let trackVideo = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid)
let videoFileAsset = AVURLAsset(url: currentURL!, options: nil)
let videoFileAssetTrack = videoFileAsset.tracks(withMediaType: AVMediaTypeVideo)[0]