首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL视频播放器的纹理缓冲区

OpenGL视频播放器的纹理缓冲区
EN

Stack Overflow用户
提问于 2011-07-21 19:07:19
回答 1查看 1.8K关注 0票数 1

我正在使用OpenGL,Ffmpeg和SDL来播放视频,目前正在优化获取帧的过程,解码它们,将它们从YUV转换为RGB,将它们上传到纹理并在四元菜单上显示纹理。这些阶段中的每个阶段都由单独的线程执行,并写入由SDL互斥锁和条件控制的共享缓冲区(上传和显示纹理除外,因为它们需要在相同的上下文中)。

我让播放器在单独的线程上很好地处理解码、转换和OpenGL上下文,但意识到因为视频是每秒25帧,所以我只能从缓冲区获得转换后的帧,将其上传到OpenGL,并在OpenGL线程中每40毫秒绑定/显示一次。由于40毫秒的间隔,渲染循环大约循环6-10次,不会显示它所显示的每一帧的下一帧。

因此,我决定为纹理也设置一个缓冲区,并设置一个用glGenTextures()和我需要的glParameters等创建和初始化的纹理数组。

当距离上一次帧刷新还不到40ms时,将运行一个方法,该方法从转换缓冲区中抓取下一个转换的帧,并通过绑定将其上传到纹理缓冲区中的下一个空闲纹理,然后调用glTexSubImage2D()。当距离上次帧刷新已过去40ms时,将运行一个分离方法,该方法从纹理缓冲区获取下一个GLuint纹理,并将其与glBindTexture()绑定。因此,有效地,我只是将之前所做的事情(从转换缓冲区抓取,上传,显示)分成不同的方法(从转换缓冲区抓取,上传到纹理缓冲区|和|从纹理缓冲区抓取,显示),以利用40ms刷新之间浪费的时间。

这听起来合理吗?因为当运行时,视频总是以零星的方式停止,有时大约播放4帧,当它们应该播放(每40ms),但然后有2秒的间隙,然后显示1帧,然后3秒的间隙,视频完全看不到。

代码与我管理convert线程从解码缓冲区抓取解码帧的方式几乎相同,将它们从YUV转换为RGB,然后将它们放入convert缓冲区,因此看不到巨大的瓶颈可能在哪里。

瓶颈会出现在OpenGL方面吗?我将新的图像数据存储到10个不同的纹理是不是就是问题所在,因为当从纹理缓冲区中抓取新的纹理时,原始数据可能与视频内存上的最后一个在内存位置上相距一百万英里?这是我唯一想要回答的问题,但我对OpenGL的内部工作原理知之甚少,这就是我在这里发帖的原因。

有谁有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2011-07-21 19:46:06

我不是OpenGL专家,但我对瓶颈的猜测是,纹理在系统内存中被正确初始化,但在“错误”的时间被发送到显存(比如一下子全部发送,而不是尽快发送),从而延迟了流水线。使用glTexSubImage2D时,在绑定纹理之前,无法保证纹理何时到达视频内存。

在谷歌上搜索一下,似乎像素缓冲区对象让你可以更好地控制它们何时在视频内存中:http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=262523

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6775055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档