- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要拍摄一段视频,将每一帧转换为图像并将这些图像保存到磁盘。为了效率起见,我想使用 AVAssetImageGenerator
,并且有类似于以下的代码:
问题是我不知道什么时候所有图像生成完成,但我需要在所有帧都写入磁盘后采取行动。例如:
assetGenerator.generateCGImagesAsynchronously(forTimes: frameTimes, completionHandler: { (requestedTime, image, actualTime, result, error) in
// 1. Keep a reference to each image
// 2. Wait until all images are generated
// 3. Process images as a set
})
让我失望的是上面的第 2 步。我想我可以尝试计算调用完成处理程序的次数,并在计数等于帧数时触发适当的方法。
但我想知道是否有一种方法可以使用 API 来了解每一帧的处理时间?也许只是我错过了什么?任何指导或建议将不胜感激。
最佳答案
我会逐步处理图像,无论如何您无法一次将它们全部放入内存。为此,您可以使用 assetGenerator.copyCGImageAtTime
在特定时间对视频进行采样。
但是你可能会过采样(重复帧)或欠采样(跳帧)。如果您关心这一点,请尝试使用 AVAssetReader
读取视频中的所有帧:
let reader = try! AVAssetReader(asset: asset)
let videoTrack = asset.tracks(withMediaType: AVMediaType.video)[0]
// read video frames as BGRA
let trackReaderOutput = AVAssetReaderTrackOutput(track: videoTrack, outputSettings:[String(kCVPixelBufferPixelFormatTypeKey): NSNumber(value: kCVPixelFormatType_32BGRA)])
reader.add(trackReaderOutput)
reader.startReading()
while let sampleBuffer = trackReaderOutput.copyNextSampleBuffer() {
if let imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) {
// now you have images as CVImageBuffers/CVPixelBuffers
process(imageBuffer)
}
}
这会将所有帧作为 CVPixelBuffer
提供给您。您可以使用代码轻松地将它们转换为其他类型 like this .如果您对帧的时间戳感兴趣,请调用 CMSampleBufferGetPresentationTimeStamp(sampleBuffer)
。
关于ios - 我怎么知道 generateCGImagesAsynchronously 何时完全完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641013/
我想将图像生成到 ScrollView (就像视频在默认 ios 播放器中开始播放时一样)。 let imageView = UIImageView() let asset :AVAsset = AV
根据文档,generateCGImagesAsynchronously 接受一个 NSValue 数组,并根据视频和给定时间生成帧,并将其作为回调返回。 我使用以下代码生成值列表 var va
我需要拍摄一段视频,将每一帧转换为图像并将这些图像保存到磁盘。为了效率起见,我想使用 AVAssetImageGenerator,并且有类似于以下的代码: 问题是我不知道什么时候所有图像生成完成,但我
我是一名优秀的程序员,十分优秀!