【问题标题】:How do I know when generateCGImagesAsynchronously has completely finished?我怎么知道 generateCGImagesAsynchronously 何时完全完成?
【发布时间】:2017-01-31 03:32:54
【问题描述】:

我需要拍摄视频,将每一帧转换为图像并将这些图像保存到磁盘。为了效率,我想使用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 来了解每个帧的处理时间?也许只是我错过了什么?任何指导或建议将不胜感激。

【问题讨论】:

  • 你计算图片的想法有什么问题?

标签: ios swift avfoundation avasset avassetimagegenerator


【解决方案1】:

我会逐步处理图像,无论如何您无法一次将它们全部放入内存中。为此,您可以使用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)
        }
    }

这会给你所有的帧CVPixelBuffers。您可以使用代码like this 轻松地将它们转换为其他类型。如果您对帧的时间戳感兴趣,请致电CMSampleBufferGetPresentationTimeStamp(sampleBuffer)

【讨论】:

  • 谢谢,这看起来是一个更好的解决方案。
  • 嘿,我尝试使用此代码,工作正常,但是当我获取 imageBuffer 时,我将其转换为 UIImage,它会导致内存崩溃。知道如何解决这个问题吗?
  • 听起来你保留了太多的图像缓冲区或 UIImages。如果这不能帮助您解决问题,请在新问题中发布您的代码。
  • 是的,但是方向变成了原生状态,所以我们必须做一些事情来让图像在录制方向后旋转,这意味着一些额外的编码和搜索。
  • 啊 - generateCGImagesAsynchronously 对你有用吗?我不知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
相关资源
最近更新 更多