ios – 我如何知道generateCGImages异步何时完成?

ios – 我如何知道generateCGImages异步何时完成?,第1张

概述我需要拍摄视频,将每个帧转换为图像并将这些图像保存到磁盘.为了提高效率,我想使用AVAsset ImageGenerator,并且代码类似于以下代码: 问题是我不知道所有图像生成何时完成,但是我需要在所有帧都写入磁盘后采取行动.例如: assetGenerator.generateCGImagesAsynchronously(forTimes: frameTimes, completionHand 我需要拍摄视频,将每个帧转换为图像并将这些图像保存到磁盘.为了提高效率,我想使用AVAsset ImageGenerator,并且代码类似于以下代码:

问题是我不知道所有图像生成何时完成,但是我需要在所有帧都写入磁盘后采取行动.例如:

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异步何时完成?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1072998.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存