代码之家  ›  专栏  ›  技术社区  ›  Mohammed Atif

avassetimagegenerator的帧不正确。同步生成心电图图像

  •  2
  • Mohammed Atif  · 技术社区  · 6 年前

    根据文件, generateCGImagesAsynchronously 接受一个数组 NSValue 并根据视频和给定时间生成帧,并将其作为回调返回。

    我使用以下代码生成值列表

        var values : [NSValue] = []
        let frameDuration = CMTimeMake(1, timeScale)
        for i in 0..<duration{
            let lastFrameTime = CMTimeMake(Int64(i), timeScale)
            let presentationTime = (i == 0) ? lastFrameTime : CMTimeAdd(lastFrameTime, frameDuration)
    
            values.append(NSValue(time: presentationTime))
    
            //Next two lines of codes are just to cross check the output
            let image = try! imageGenerator.copyCGImage(at: presentationTime, actualTime: nil)
            let imageUrl = FileManagerUtil.getTempFileName(parentFolder: FrameExtractor.EXTRACTED_IMAGE, fileNameWithExtension: "\(Constants.FRAME_SUFFIX)\(i)\(".jpeg")")
        }
    

    正如您在上面的代码中看到的,我使用同步方法交叉检查了结果,并且我可以确认 values 数组保存正确的时间引用。

    但当相同的数组被传递给 generateImageAsynchronously 方法,对于不同的时间戳,我得到相同帧的副本10次。也就是说,如果我的视频是10秒,那么我会得到300帧(每秒30帧),但是第一秒的帧会重复10次。它类似于在请求1秒钟时返回0.1秒的帧。

    P.S:虽然同步方法运行良好,但它需要 异步方法所用的时间。可能是因为它回来了 相同的帧。但我需要它来检查实际的时间使用。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mohammed Atif    6 年前

    不知道为什么,但是当从主线程调用函数时,我得到了错误。但当我从后台线程调用它时,它就开始工作了。

    不确定解释,但是下面的swift4代码似乎在工作,与单独的帧提取相比要快得多,比如 let image = imageGenerator.copyCGImage(at: time, actualTime: nil)

    DispatchQueue.global(qos: .background).async {
        imageGenerator.generateCGImagesAsynchronously(forTimes: localValue, completionHandler: ({ (startTime, generatedImage, endTime, result, error) in
            //Save image to file or perform any task
        }))
    }