我使用制作了一个视频播放器Qt
,OpenGl
并且FFMpeg
效果很好。
现在,我想使用多线程和缓冲区来获得更好的性能。我设置了一个线程,对帧进行解码并将其存储在QMap中:
QMap<int, uint8_t *> myBuffer;
第一个int是时间码,第二个是OpenGl Texture。
每次解码帧时,我都会使用new
将该帧添加到缓冲区中,并在读取帧后立即将delete
其添加。
假设这不是最佳方法,不是内存管理(无内存泄漏),而是性能。
有更好的方法来做到这一点吗?
您可以直接解码为OpenGL像素缓冲区对象。创建一个数量(3个或4个就足够了)的PBO,并使渲染器线程至少使用其中的2个将它们映射到进程地址空间glMapBuffer
,并将位置和PBO ID排队到可用缓冲区池中。要解码帧,请从可用的PBO池中取出指针/ ID,然后解码到提供的内存中。解码完一帧后,将使用的PBO的ID排入“解码的”池中,渲染器线程使用该池glUnmapBuffer();
立即取消映射,然后使用加载到纹理中glTexSubImage2D
; 纹理上传异步发生。将纹理ID排队到“准备显示”队列/ FIFO中。然后让渲染器从“准备显示”队列中退出,以显示纹理;通过在“准备显示”中保留至少3个元素,FIFO帧可以异步上载,同时绘制先前已解码的帧而没有OpenGL阻塞,因为它必须等待之前的步骤完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句