问题是我不知道所有图像生成何时完成,但是我需要在所有帧都写入磁盘后采取行动.例如:
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})
这是上面的第二步,这让我感到沮丧.我想我可以尝试计算调用完成处理程序的次数,并在计数等于帧数时触发适当的方法.
但我想知道是否有办法使用API来了解每个帧何时被处理?也许只是我错过的东西?任何指导或建议将不胜感激.
解决方法 我会逐步处理图像,无论如何你都无法将它们全部放入内存中.为此,您可以使用assetGenerator.copyCGImageAtTime在特定时间对视频进行采样.但是你可以过采样(重复帧)或欠采样(跳帧).如果您关心这一点,那么尝试使用AVAssetReader读取视频中的所有帧:
let reader = try! AVAssetReader(asset: asset)let vIDeoTrack = asset.tracksWithMediaType(AVMediaTypeVIDeo)[0]// read vIDeo frames as BGRAlet trackReaderOutput = AVAssetReaderTrackOutput(track: vIDeoTrack,outputSettings:[String(kCVPixelBufferPixelFormatTypeKey): NSNumber(unsignedInt: kCVPixelFormatType_32BGRA)])reader.addOutput(trackReaderOutput)reader.startReading()while let sampleBuffer = trackReaderOutput.copyNextSampleBuffer() { if let imageBuffer = CMSampleBufferGetimageBuffer(sampleBuffer) { // Now you have images as CVImageBuffers/CVPixelBuffers process(imageBuffer) }}
这为您提供了所有帧作为CVPixelBuffers.您可以使用代码like this轻松地将它们转换为其他类型.如果您对帧的时间戳感兴趣,请调用CMSampleBufferGetPresentationTimeStamp(sampleBuffer).
总结以上是内存溢出为你收集整理的ios – 我如何知道generateCGImages异步何时完成?全部内容,希望文章能够帮你解决ios – 我如何知道generateCGImages异步何时完成?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)