オーディオおよびビデオ プロジェクト - FFmpeg および SDL に基づくオーディオおよびビデオ プレーヤー分析 (21)

導入

このシリーズでは、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 関数がどのように実行されるかを確認し、全体を実行することができます。

次に何が起こったのか知りたい場合は、次回の内訳を聞いてください。

おすすめ

転載: blog.csdn.net/weixin_60701731/article/details/134587119