在override的AVVideoCompositing协议方法中使用autoreleasepool来管理处理中产生的CIImage,避免内存泄漏。
示例代码如下:
class CustomCompositor: NSObject, AVVideoCompositing {
func startRequest(_ request: AVAsynchronousVideoCompositionRequest) {
// Create a block which will be later used for asynchronous processing
request.finish(composedVideoFrame: CIImage(), completionHandler: { [weak self] in
self?.cleanup()
})
// Do some heavy image processing with CIImage
let sourcePixelBuffer = request.sourceFrame(byTrackID: 1)!
let sourceImage = CIImage(cvPixelBuffer: sourcePixelBuffer)
let outputImage = // Perform some CIImage processing
// Use an autoreleasepool to manage memory created during the image processing
autoreleasepool {
// Create a new pixel buffer to return
var pixelBuffer: CVPixelBuffer?
CVPixelBufferCreate(nil, request.renderSize.width,
request.renderSize.height, kCVPixelFormatType_32BGRA,
nil, &pixelBuffer)
// Render the output image to the new pixel buffer
CIContext().render(outputImage, to: pixelBuffer!)
// Finish the asynchronous processing by passing the final composed frame to the request
let finalImage = CIImage(cvPixelBuffer: pixelBuffer!)
request.finish(composedVideoFrame: finalImage)
}
}
func cleanup() {
// Cleanup any remaining resources here
}
}