根据:
我可以使用 AVFoundation 将下载的视频帧流式传输到 OpenGL ES 纹理中吗?
可以从远程媒体获取帧。但是我一直在尝试这个建议,但是关于使用的文档AVPlayerItemVideoOutput
不是很清楚,它似乎有一个委托方法outputMediaDataWillChange
,它有指向AVPlayerItemVideoOutput
实例的指针。
也许我做错了假设,但是每次数据发生变化时都会调用这个委托方法?这是获得CVPixelBuffer
?的正确位置。
根据:
我可以使用 AVFoundation 将下载的视频帧流式传输到 OpenGL ES 纹理中吗?
可以从远程媒体获取帧。但是我一直在尝试这个建议,但是关于使用的文档AVPlayerItemVideoOutput
不是很清楚,它似乎有一个委托方法outputMediaDataWillChange
,它有指向AVPlayerItemVideoOutput
实例的指针。
也许我做错了假设,但是每次数据发生变化时都会调用这个委托方法?这是获得CVPixelBuffer
?的正确位置。
可能不是。您将需要在与您的 GL 执行所有工作或其他具有共享上下文的线程相同的线程上更新纹理,而不是在您获得媒体数据已更新的委托回调的线程上。您可以在此回调中将一些布尔值设置为 true 以通知 GL 线程缓冲区已准备好并且应该收集它。或者,您可以推送一些“目标选择器对”以在 GL 线程上执行以收集数据(系统如“performSelectorOnMainThread”),但是您应该再次询问自己,如果媒体更新是这样的对已经存在于堆栈中更快地更改数据然后您的 GL 正在刷新...无论如何,如果您使用该委托并且没有正确处理它,它根本不会更新纹理,或者它会阻塞您的 GL 线程。
方法outputMediaDataWillChange
只会在注册后被调用requestNotificationOfMediaDataChangeWithAdvanceInterval
,通常是当你暂停你的应用程序等时。
您可以在显示链接挂钩中访问像素缓冲区。在 Apple 示例中查找hasNewPixelBufferForItemTime
和copyPixelBufferForItemTime
(它适用于 OS X,但基本上适用于 iOS。
我认为,您应该使用 ffmpeg 库,因为该库可以连接任何流媒体服务器并获取原始数据中的图片。之后,您可以对那张照片做任何事情。