【问题标题】:iOS AVFoundation to stream video into OpenGL TextureiOS AVFoundation 将视频流式传输到 OpenGL 纹理
【发布时间】:2013-03-07 16:35:01
【问题描述】:

根据:

Can I use AVFoundation to stream downloaded video frames into an OpenGL ES texture?

可以从远程媒体获取帧。不过我一直在尝试这个建议,但是关于使用AVPlayerItemVideoOutput 的文档不是很清楚,它似乎有一个委托方法outputMediaDataWillChange,它有指向AVPlayerItemVideoOutput 实例的指针。

也许我做错了假设,但是每次数据发生变化时都会调用这个委托方法?这是获取CVPixelBuffer?的正确位置。

【问题讨论】:

    标签: objective-c ios opengl-es streaming avfoundation


    【解决方案1】:

    方法outputMediaDataWillChange只会在注册requestNotificationOfMediaDataChangeWithAdvanceInterval后被调用,通常是在你暂停应用等的时候。

    您可以在显示链接挂钩中访问像素缓冲区。在 Apple 示例中查找 hasNewPixelBufferForItemTimecopyPixelBufferForItemTime(适用于 OS X,但基本上适用于 iOS。

    【讨论】:

      【解决方案2】:

      可能不会。您将需要在与您的 GL 执行所有工作的线程或具有共享上下文的其他线程相同的线程上更新纹理,而不是在您获得媒体数据已更新的委托回调的线程上。您可以在此回调中将一些布尔值设置为 true 以通知 GL 线程缓冲区已准备好并且应该收集它。或者,您可以推送一些“目标选择器对”以在 GL 线程上执行以收集数据(系统如“performSelectorOnMainThread”),但是您应该再次询问自己,如果媒体更新是这样的对已经存在于堆栈中更快地更改数据然后您的 GL 正在刷新...无论如何,如果您使用该委托并且没有正确处理它,它根本不会更新纹理,或者它会阻塞您的 GL 线程。

      【讨论】:

        【解决方案3】:

        我认为,您应该使用 ffmpeg 库,因为该库可以连接任何流媒体服务器并获取原始数据中的图片。之后你就可以用这张照片做任何事了。

        【讨论】:

        • 你和链接SDK背后的人有关系吗?如果是这样,您可能应该披露这一点。
        猜你喜欢
        • 1970-01-01
        • 2011-11-05
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 2018-03-13
        • 2018-07-11
        相关资源
        最近更新 更多