我需要导出视频,同时用背景图像操纵它的每一帧。现在我用最终帧再次组装它,并使用 AVAssetWriter
写入它,并收到 50 帧的内存警告。
我正在使用 swift-video-generator 并发送所有帧和单个音频文件以生成最终输出。
private func getVideoAllFramesAndAppendItWithFinalCanvasImageBackground(asset:AVAsset, backgroundImage:UIImage, videoRect:CGRect) {
var frameCount:Int = 0
let lastIndex:Int = 130 //Checking optimize way to handle all frame without reading it in memory
let assetReader = try! AVAssetReader(asset: asset)
let assetTrack = asset.tracks(withMediaType: AVMediaType.video).first!
let assetReaderOutputSettings = [
kCVPixelBufferPixelFormatTypeKey as String: NSNumber(value: kCVPixelFormatType_32BGRA)
]
let assetReaderOutput = AVAssetReaderTrackOutput(track: assetTrack, outputSettings: assetReaderOutputSettings)
assetReaderOutput.alwaysCopiesSampleData = false
assetReader.add(assetReaderOutput)
assetReader.startReading()
var sample: CMSampleBuffer? = assetReaderOutput.copyNextSampleBuffer()
while (sample != nil) {
frameCount = frameCount + 1
print(frameCount)
sample = assetReaderOutput.copyNextSampleBuffer()
if sample != nil {
self.convertBufferImageToUIImage(sampleBuffer: sample!, canvasExportImage: backgroundImage, videoRect: videoRect)
}
if frameCount == lastIndex {
break
}
}
print(frameCount)
if lastIndex == frameCount {
self.writeVideoWithFinalFrames(finalFrames: self.finalVideoExportFrames, videoAsset:asset)
}
}
有没有什么方法可以做到这一点,而不会面临 iOS 中的内存问题?
最佳答案
你能尝试这样的事情吗?
while (assetReaderOutput.copyNextSampleBuffer() != nil) {
autoreleasepool {
frameCount = frameCount + 1
print(frameCount)
let sample: CMSampleBuffer? = assetReaderOutput.copyNextSampleBuffer()
if sample != nil {
self.convertBufferImageToUIImage(sampleBuffer: sample!, canvasExportImage: backgroundImage, videoRect: videoRect)
}
if frameCount == lastIndex {
break
}
}
}
希望对你有帮助
关于iOS:在处理每帧视频并用音频文件重写时收到内存警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57142449/