介绍
在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器
如果您不理解本文,可参考我的前一篇文章音视频项目—基于FFmpeg和SDL的音视频播放器解析(二十)
解析
我们继续解析 videooutput 的函数
RefreshLoopWaitEvent:
#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:
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 函数是如何运行的,把总体运行起来。
欲知后事如何,请听下回分解。