【问题标题】:Reading video frame-by-frame under iOSiOS下逐帧读取视频
【发布时间】:2011-07-21 21:45:02
【问题描述】:

我正在寻找一种方法来使用 iOS API 检索视频的各个帧。 我尝试使用 AVAssetImageGenerator 但它似乎只提供最接近秒的帧,这对我的使用来说有点太粗糙了。

根据我对文档的了解,AVAssetReader、AVAssetReaderOutput 和 CMSampleBufferGetImageBuffer 的管道我应该能够做一些事情,但我被 CVImageBufferRef 卡住了。有了这个,我正在寻找一种方法来获取 CGImageRef 或 UIImage 但还没有找到。

不需要实时,我越能坚持提供的 API 越好。

非常感谢!

编辑: 基于这个站点:http://www.7twenty7.com/blog/2010/11/video-processing-with-av-foundation 和这个问题:how to convert a CVImageBufferRef to UIImage 我正在接近解决方案。问题,AVAssetReader 在第一个 copyNextSampleBuffer 之后停止读取,而没有给我任何东西(sampleBuffer 为 NULL)。

视频可由 MPMoviePlayerController 读取。我不明白怎么了。

【问题讨论】:

    标签: ios video frame avfoundation core-video


    【解决方案1】:

    上面的两个链接实际上回答了我的问题,空的copyNextBufferSample 是 iOS SDK 5.0b3 的问题,它可以在设备上运行。

    【讨论】:

    • 你是如何检索所有帧的?我尝试了 7twenty7 中提到的步骤。在 readNextMovieFrame 方法中,我在 While 循环中添加了 If 条件,该条件仅在 movieReader.status == AVAssetReaderStatusCompleted 时才会中断。然后我检索POST 中提到的图像并添加到数组中。但奇怪的是,即使是 6 秒的视频,应用程序也会崩溃。我知道我在做一些愚蠢的错误。你能帮我解决这个问题吗..
    • 你绝对不应该将帧保存在数组中,否则你会很快耗尽内存(这可能是你发生的事情)。一个 720p 帧大约是 3.5M 未压缩。以 30 帧/秒的速度计算 :)
    • 感谢您的快速回复。关于我应该做什么的任何建议?
    • 嗯,这取决于你想做什么。
    • 拍摄视频后,我想获取视频的各个帧。整套框架。
    【解决方案2】:

    AVAssetImageGenerator 对于抓取的确切帧时间具有非常宽松的默认容差。它有两个确定容差的属性:requestedTimeToleranceBeforerequestedTimeToleranceAfter。这些容差默认为kCMTimePositiveInfinity,因此如果您想要准确的时间,请将它们设置为kCMTimeZero 以获得准确的帧数。

    (获取精确帧可能比获取近似帧需要更长的时间,但您声明实时不是问题。)

    【讨论】:

      【解决方案3】:

      使用AVReaderWriter。虽然它是一个 OS X Apple 示例代码,但 AVFoundation 在两个平台上都可用,几乎没有什么变化。

      【讨论】:

        猜你喜欢
        • 2014-08-24
        • 2013-11-08
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        相关资源
        最近更新 更多