導入
このシリーズでは、gitee プロジェクトのオーディオおよびビデオ プレーヤーの説明に多くの時間を費やす予定です。このプロジェクトでは、オーディオとビデオのカプセル化解除、デコード、および SDL レンダリング関連の知識を学ぶことができます。ソース コードに興味がある場合は、FFmpeg および SDL に基づくオーディオおよびビデオ プレーヤーをチェックしてください。
この記事が理解できない場合は、以前の記事「オーディオおよびビデオ プロジェクト - FFmpeg および SDL に基づくオーディオおよびビデオ プレーヤーの分析 (Twenty)」を参照してください。
解析する
ビデオ出力の関数を解析し続けましょう
RefreshLoopWaitイベント:
#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 を更新します
メインループ:
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: キーの押下を検出し、エスケープの場合は終了します。
SDL_QUIT: タイプが QUIT (停止) の場合に終了します。
さて、videooutput クラスが解析されたので、いよいよ main 関数がどのように実行されるかを確認し、全体を実行することができます。
次に何が起こったのか知りたい場合は、次回の内訳を聞いてください。