AVAssetReaderOutput内存问题

时间:2016-01-17 15:51:06

标签: swift macos avassetreader

我正在使用AVAssetReaderOutput(更具体地说是AVAssetReaderTrackOutput)逐帧处理视频。我使用copyNextSampleBuffer()方法获得视频的连续帧。处理后我没有对帧进行任何引用,但是当我循环读取整个视频时,我看到渐进式内存消耗,内存使用量大约是视频的大小。在处理大(> 1GB)文件时这是有问题的。最初我以为我可能有内存泄漏,但我已将问题隔离到AVAssetReaderTrackOutput对象。

例如,如果我只是循环浏览视频并使用copyNextSampleBuffer()方法,我会看到内存消耗问题。在以下代码段中,asset是从视频文件初始化的AVURLAsset对象:

guard let videoTrack = asset.tracksWithMediaType(AVMediaTypeVideo).first else { return }
let outputSettings: [String: AnyObject] = [kCVPixelBufferPixelFormatTypeKey as String: NSNumber(unsignedInt: kCVPixelFormatType_32ARGB)]
videoTrackOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings: outputSettings)
videoTrackOutput.alwaysCopiesSampleData = false
assetReader.addOutput(videoTrackOutput)
let _ = assetReader.startReading()
while self.assetReader.status == AVAssetReaderStatus.Reading {
     videoTrackOutput.copyNextSampleBuffer()
}

我考虑过修改读取方法以在较短的段中读取和处理视频以避免过多的内存使用,但我无法释放AVAssetReaderTrackOutput对象消耗的内存。例如,如果我在使用它之后将对象设置为nil,则根据Xcode调试导航器不会释放内存:

videoTrackOutput = nil
assetReader = nil

我错过了什么吗?是否有另一种方法来释放videoTrackOutput对象似乎使用的内存?

如果没有,是否还有其他方法可以逐帧读取没有此问题的视频?

1 个答案:

答案 0 :(得分:2)

如果您查阅copyNextSampleBuffer的文档,请注意以下事项:

  

所有权遵循The Create Rule

创建规则来自Core Foundation:如果一个函数包含单词" Create"或"复制"那么你负责释放返回的对象。 ARC会自动为ARC管理的对象执行此操作,但CMSampleBuffer不是由ARC管理的。

因此,当您完成此对象时,需要在其上调用CFRelease以避免内存泄漏。