如何将 AVAsset 转换为 CMSampleBuffer 帧?

问题描述

我的应用导入用户通过系统文件选择器选择的视频,它以 AVAsset 的形式出现:

@IBAction func handleImportVideoButton(_ sender: Any) {
    let documentPicker = UIDocumentPickerViewController(foropeningContentTypes: [.movie],ascopy: true)
    documentPicker.delegate = self
    present(documentPicker,animated: true)
}

// UIDocumentPickerDelegate callback.
func documentPicker(_ controller: UIDocumentPickerViewController,didPickDocumentsAt urls: [URL]) {
    guard let url = urls.first else {
        return
    }
    model.recordedVideoSource = AVAsset(url: url)
}

然后我如何将这个 AVAsset 转换为 CMSampleBuffer 帧?最终目标是将 CMSampleBuffer 帧转换为 CGImage,以便我可以考虑对每个图像帧执行机器学习分析。

解决方法

这是未经测试的,但它应该为您提供如何进行此操作的要点:

let asset = AVAsset()
let reader = AVAssetReader(asset: asset)
guard let track = asset.tracks(withMediaType: .video).last else {
    return
}
let trackOutput = AVAssetReaderTrackOutput(track: track,outputSettings: nil)
reader.add(trackOutput)
reader.startReading()

// Get first sample buffer
var sample = trackOutput.copyNextSampleBuffer()
while sample != nil {
    // iterate over all buffers
    // sample = trackOutput.copyNextSampleBuffer()
}