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