我正在寻找一种方法来检索使用iOS API的视频的各个帧。我尝试使用AVAssetImageGenerator,但它似乎只提供帧到最近的一秒,这对我的使用有点太粗糙了。
从我对文档的理解,AVAssetReader, AVAssetReaderOutput和CMSampleBufferGetImageBuffer的管道我应该能够做一些事情,但我被困在CVImageBufferRef。有了这个,我正在寻找一种方法来获得一个CGImageRef或一个UIImage,但还没有找到它。
不需要实时,我越能坚持提供API越好。
非常感谢!
编辑:基于这个网站:http://www.7twenty7.com/blog/2010/11/video-processing-with-av-foundation和这个问题:如何转换CVImageBufferRef到UIImage我接近一个解决方案。问题,AVAssetReader在第一个copyNextSampleBuffer
后停止阅读而不给我任何东西(sampleBuffer为NULL)。
视频是MPMoviePlayerController可读的。我不知道怎么了。
上面的两个链接实际上回答了我的问题,空的copyNextBufferSample
是iOS SDK 5.0b3的问题,它在设备上工作
AVAssetImageGenerator
对于被抓取的确切帧时间具有非常宽松的默认容差。它有两个决定容忍度的特性:requestedTimeToleranceBefore
和requestedTimeToleranceAfter
。这些公差默认为kCMTimePositiveInfinity
,所以如果你想要精确的时间,将它们设置为kCMTimeZero
以获得精确的帧数。
(获取精确帧可能比获取近似帧需要更长的时间,但您声明实时性不是问题)
使用AVReaderWriter。虽然它是一个OS X Apple的示例代码,但AVFoundation在两个平台上都可以使用,只需做一些更改。