gpt4 book ai didi

swift - AVAssetReaderOutput 内存问题

转载 作者:可可西里 更新时间:2023-11-01 01:00:38 26 4
gpt4 key购买 nike

我正在使用 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 对象使用的内存?

如果没有,有没有其他逐帧读取视频的方法没有这个问题?

最佳答案

如果您查阅 copyNextSampleBuffer 的文档,您会注意到以下内容:

Ownership follows the The Create Rule.

Create 规则来自 Core Foundation:如果一个函数包含单词“Create”或“Copy”,那么您有责任释放返回的对象。 ARC 会自动为 ARC 管理的对象执行此操作,但 CMSampleBuffer 不是 ARC 管理的。

因此,当您使用完此对象后,您需要对其调用 CFRelease 以避免内存泄漏。

关于swift - AVAssetReaderOutput 内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34840288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com