It seems like the generated video is not streamed onto the disk but rather written to memory for it to be written to disk all at once. How can I force it to stream the data to disk while the encoding is happening?
Btw. my app itself consistently needs around 300MB of memory, so I don't think I have a memory leak here.
Here is the relevant code:
Code Block func analyse() { self.videoWritter = try! AVAssetWriter(outputURL: outputVideo, fileType: AVFileType.mp4) let writeSettings: [String: Any] = [ AVVideoCodecKey: AVVideoCodecType.h264, AVVideoWidthKey: videoSize.width, AVVideoHeightKey: videoSize.height, AVVideoCompressionPropertiesKey: [ AVVideoAverageBitRateKey: 10_000_000, ] ] self.videoWritter!.movieFragmentInterval = CMTimeMake(value: 60, timescale: 1) self.frameInput = AVAssetWriterInput(mediaType: AVMediaType.video, outputSettings: writeSettings) self.frameInput?.expectsMediaDataInRealTime = true self.videoWritter!.add(self.frameInput!) if self.videoWritter!.startWriting() == false { print("Could not write file: \(self.videoWritter!.error!)") return } } func writeFrame(frame: Frame) { /* some more code to determine the correct frame presentation time stamp */ let newSampleBuffer = self.setTimeStamp(frame.sampleBuffer, newTime: self.nextFrameStartTime!) self.frameInput!.append(newSampleBuffer) /* some more code */ } func setTimeStamp(_ sample: CMSampleBuffer, newTime: CMTime) -> CMSampleBuffer { var timing: CMSampleTimingInfo = CMSampleTimingInfo( duration: CMTime.zero, presentationTimeStamp: newTime, decodeTimeStamp: CMTime.zero ) var newSampleBuffer: CMSampleBuffer? CMSampleBufferCreateCopyWithNewTiming( allocator: kCFAllocatorDefault, sampleBuffer: sample, sampleTimingEntryCount: 1, sampleTimingArray: &timing, sampleBufferOut: &newSampleBuffer ) return newSampleBuffer! }
My specs:
MacBook Pro 2018
32GB Memory
macOS Big Sur 11.1