介紹
在本系列,我打算花大篇幅講解我的 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 函數是如何運行的,把總體運行起來。
欲知后事如何,請聽下回分解。