我正在尝试使用此问题中接受的答案中的方法来读取视频帧:使用 AVPlayer 访问单个帧 https://stackoverflow.com/questions/39570745/accesing-individual-frames-using-av-player/.
然后,我尝试在 MetalKit MKTView 上按顺序显示这些帧(我尝试在常规 UIImage 视图上,视频根本不渲染)。问题是,这只适用于几秒钟(大约 400 帧视频),之后应用程序崩溃并且视频停止播放。
这是视图控制器中的代码:
class MetalRenderViewController: UIViewController {
var metalView: MetalRenderView!
var videoFileReader: VideoFileReader?
var videoUrl: URL!
override func viewDidLoad() {
super.viewDidLoad()
metalView = MetalRenderView(frame: view.bounds, device: MTLCreateSystemDefaultDevice())
view.addSubview(metalView)
videoFileReader = VideoFileReader(videoUrl: videoUrl) { (image) in
guard let image = image else {return}
self.metalView.image = image
}
videoFileReader?.beginReadingAsset()
}
}
这是 videoFileReader 中的相关代码:
guard let track = asset.tracks(withMediaType: .video).first else {return}
let reader = try! AVAssetReader(asset: asset)
let output = AVAssetReaderTrackOutput(track: track, outputSettings: settings)
reader.add(output)
reader.startReading()
while let sampleBuffer = output.copyNextSampleBuffer() {
guard let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
DispatchQueue.main.async {
let image = CIImage(cvImageBuffer: imageBuffer)
self.callback(image)
}
}
我怀疑这个问题可能与高内存利用率有关,因为在调试器中,内存使用量飙升至约 1.5 GB,然后在崩溃后下降,尽管我没有看到任何内存警告。
这是错误日志:
2021-06-28 16:13:22.491431-0400 WorkoutApp[10844:2837856] [xpc] XPC error talking to pkd: Connection interrupted
2021-06-28 16:13:22.773817-0400 WorkoutApp[10844:2837835] [ServicesDaemonManager] interruptionHandler is called. -[FontServicesDaemonManager connection]_block_invoke
2021-06-28 16:13:28.057141-0400 WorkoutApp[10844:2837857] [lifecycle] [u 5485F2DA-5C8A-40DD-91A5-F248E652AA58:m (null)] [com.apple.mobileslideshow.photo-picker(1.0)] Connection to plugin interrupted while in use.
2021-06-28 16:13:28.075489-0400 WorkoutApp[10844:2838140] [lifecycle] [u 5485F2DA-5C8A-40DD-91A5-F248E652AA58:m (null)] [com.apple.mobileslideshow.photo-picker(1.0)] Connection to plugin invalidated while in use.
如果有人可以帮助我减少内存利用率,或者建议一种更好的方法来完全做到这一点,我将不胜感激。
Edit
更新标题以更具体地描述错误,删除金属渲染类,这是一个转移注意力的类。