ter*_*ma9 5 avfoundation ios avasset avassetimagegenerator swift
我需要拍摄视频,将每个帧转换为图像并将这些图像保存到磁盘.我想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
})
Run Code Online (Sandbox Code Playgroud)
这是上面的第二步,这让我感到沮丧.我想我可以尝试计算调用完成处理程序的次数,并在计数等于帧数时触发适当的方法.
但我想知道是否有办法使用API来了解每个帧何时被处理?也许只是我错过的东西?任何指导或建议将不胜感激.
我会逐步处理图像,无论如何你都无法将它们全部放入内存中.为此,您可以使用特定时间对视频进行采样assetGenerator.copyCGImageAtTime.
但是你可以过采样(重复帧)或欠采样(跳帧).如果您关心这一点,请尝试使用AVAssetReader以读取视频中的所有帧:
let reader = try! AVAssetReader(asset: asset)
let videoTrack = asset.tracksWithMediaType(AVMediaTypeVideo)[0]
// read video frames as BGRA
let 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)
}
}
Run Code Online (Sandbox Code Playgroud)
这将为您提供所有帧CVPixelBuffer.您可以轻松地将它们转换为其他类型的使用代码这样.如果您对帧的时间戳感兴趣,请致电CMSampleBufferGetPresentationTimeStamp(sampleBuffer).
| 归档时间: |
|
| 查看次数: |
1735 次 |
| 最近记录: |