介绍
在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本文,可参考我的前一篇文章音视频项目---基于FFmpeg和SDL的音视频播放器解析(二十)
解析
我们继续解析 videooutput 的函数
RefreshLoopWaitEvent:
cpp
#define REFRESH_RATE 0.01
void VideoOutput::RefreshLoopWaitEvent(SDL_Event* event){
double remaining_time = 0.0;
SDL_PumpEvents();
while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)){
if(remaining_time > 0.0){
this_thread::sleep_for(chrono::milliseconds(int64_t(remaining_time * 1000.0)));
}
remaining_time = REFRESH_RATE;
videoRefresh(&remaining_time);
SDL_PumpEvents();
}
}
SDL_PumpEvents:用于更新事件队列并处理事件
SDL_PeepEvents:用于从事件队列中获取特定类型的事件
如果 remaining_time 大于 0,则等待一会
接着给 remaining_time 赋值 0.01
接着调用 videoRefresh,更新 SDL
MainLoop:
cpp
int VideoOutput::MainLoop(){
SDL_Event event;
while (true)
{
RefreshLoopWaitEvent(&event);
switch (event.type){
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE){
return 0;
}
break;
case SDL_QUIT:
return 0;
default:
break;
}
}
return 0;
}
主循环函数
检测 SDL_Event 的类型
SDL_KEYDOWN:检测到按键的按压,如果是 escape,则退出
SDL_QUIT:如果类型为 QUIT(停止),则退出
好了,videooutput 这个类解析完了,我们最后可以看一下,main 函数是如何运行的,把总体运行起来。
欲知后事如何,请听下回分解。