I'm trying to compress a video which has a frame rate of 30 fps into 20 fps in order to reduce the size of video using AVAssetWriter. However, during appending the new copy of sample buffer, my apps get terminated due to memory issues. I was successful to compress it if I do not change the frame rate which just directly appending the sample into the input.
This coding was implement by combining both issue and compressor from here: AVAssetWriter AVVideoExpectedSourceFrameRateKey (frame rate) ignored
And here: https://pastebin.com/CQPthmjg
videoInput.requestMediaDataWhenReady(on: videoInputQueue) {
//request data here
var previousTimingInfo: CMTime = kCMTimeZero
while (videoInput.isReadyForMoreMediaData) {
let sample = assetReaderVideoOutput.copyNextSampleBuffer()
if (sample != nil) {
autoreleasepool {
let newSample = UnsafeMutablePointer<CMSampleBuffer?>.allocate(capacity: 1)
let timingInfo = UnsafeMutablePointer<CMSampleTimingInfo>.allocate(capacity: 1)
CMSampleBufferGetSampleTimingInfo(sample!, 0, timingInfo)
timingInfo.pointee.duration = CMTimeMake(1, 20)
timingInfo.pointee.presentationTimeStamp = CMTimeAdd(previousTimingInfo, timingInfo.pointee.duration)
previousTimingInfo = timingInfo.pointee.presentationTimeStamp
let status: OSStatus = CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, sample!, 1, timingInfo, newSample)
if status == noErr {
videoInput.append(newSample.pointee!)
print("appending sample buffer...")
} else {
print("status != noErr;\nstatus: \(status)")
}
//videoInput.append(sample!)
}
} else {
videoInput.markAsFinished()
DispatchQueue.main.async {
videoFinished = true
closeWriter()
}
break;
}
}
}
Error happened as:
appending sample buffer...
appending sample buffer...
appending sample buffer...
appending sample buffer...
appending sample buffer...
appending sample buffer...
appending sample buffer...
appending sample buffer...
appending sample buffer...
Message from debugger: Terminated due to memory issue