Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用openGL创建视频播放器_Opengl_Video_Rendering_Video Player - Fatal编程技术网

如何使用openGL创建视频播放器

如何使用openGL创建视频播放器,opengl,video,rendering,video-player,Opengl,Video,Rendering,Video Player,我有一个定制的视频解码器。对于这个解码器,每当我将H.264文件(仅视频元素而非音频)作为输入时,就会得到一组YUV帧作为输出。然后,我将这个YUV帧转换为RGB24帧,并在OpenGL中进行渲染。这种转换和渲染同时进行,即逐帧进行,因此看起来就像我正在观看视频一样 一旦我完成了上述工作,我的下一个任务就是实现其他功能,如播放、暂停、后退、前进等 目前,我只是渲染帧以及如何解码和转换为RGB。也就是说,帧速率约为60-70 fps。现在,如果我必须实现这个播放/暂停功能,那么我应该如何继续。也就

我有一个定制的视频解码器。对于这个解码器,每当我将
H.264
文件(仅视频元素而非音频)作为输入时,就会得到一组
YUV
帧作为输出。然后,我将这个
YUV
帧转换为
RGB24
帧,并在
OpenGL
中进行渲染。这种转换和渲染同时进行,即逐帧进行,因此看起来就像我正在观看视频一样

一旦我完成了上述工作,我的下一个任务就是实现其他功能,如播放、暂停、后退、前进等

目前,我只是渲染帧以及如何解码和转换为RGB。也就是说,帧速率约为60-70 fps。现在,如果我必须实现这个播放/暂停功能,那么我应该如何继续。也就是说,如果暂停被按下,解码器应该等到我按下播放按钮


为同样的问题提供一些解决方案。

奇怪的是,你做了这么多,却在项目的这一点上陷入困境。如果你运行一个OpenGL程序,我假设你有一个无限循环,在这个循环中你可以捕获所有的事件(鼠标,按键),并从你的文件中读取图像,然后渲染到屏幕上(使用OpenGL)。不过,这种应用程序通常在多线程环境中运行,特别是在读取文件时。您可能希望有一个缓冲区,其中始终存储类似于so(或更多)动画的下一秒的内容,并且在执行事件循环时从该缓冲区读取内容。同时,当您从缓冲区读取内容时,线程从磁盘读取数据需要用新信息填充缓冲区

这可以使用生产者-消费者算法。请注意,虽然您不需要在多线程环境中执行此操作,但如果系统不能以每秒30帧的速度运行,则可能会出现连续性问题。在事件循环中,您可以读取下一个20帧或10帧或其他内容,然后从缓冲区、渲染等读取下一个图像

在此循环中,如果查看器按下了暂停键(例如空格),则只需在循环中传递文件读取和渲染到屏幕任务。或者,可以在渲染之前将整个文件读取到内存中

// event loop
 while (1) {
    char key = nextEvent(...)
    if (key == 'x') quiteApp();
    else if (key == 'p') { pauseApp = (pauseApp == true) ? false : true; }
    if (!pauseApp) {
        // adjust the number of frames your read in each loop depending
        // on your frame rate. If you frame rate drops below 30 fps
        // read less frames, etc.
        readFrames(&buffer, videoFile, 10);
        getNextFrameFromBuffer(buffer, frameBuffer);
        displayFrameuBuffer(frameCount, frameBuffer);
    }
    frameCount++;
    // do time synchronisation here so that you always play at given frame
    // rate which is likely to be 30 fps.
    ...
}

如果您可以发布单独的问题,而不是将您的问题合并为一个问题,这是首选。这样,它可以帮助人们回答你的问题,也可以帮助其他人寻找至少一个你的问题。