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

導入

このシリーズでは、gitee プロジェクトのオーディオおよびビデオ プレーヤーの説明に多くの時間を費やす予定です。このプロジェクトでは、オーディオとビデオのカプセル化解除、デコード、および SDL レンダリング関連の知識を学ぶことができます。ソース コードに興味がある場合は、FFmpeg および SDL に基づくオーディオおよびビデオ プレーヤーをチェックしてください。

この記事が理解できない場合は、以前の記事「オーディオおよびビデオ プロジェクト - FFmpeg および SDL に基づくオーディオおよびビデオ プレーヤーの分析 (Seventeen)」を参照してください。

解析する

以前に分析した fill_audio_pcm 関数は少し複雑なので、ここでは説明しません。

最後のクラスのビデオ出力について話しましょう。これはビデオ再生を担当する関数であることがわかります。最初に .h ファイルを見てみましょう。

#ifndef VIDEOOUTPUT_H_
#define VIDEOOUTPUT_H_

#ifdef __cplusplus
extern "C"{
#include"libavutil/avutil.h"
#include"SDL.h"
#include"libavutil/time.h"
}
#endif

#include"avframequeue.h"
#include"avsync.h"

class VideoOutput{
public:
    VideoOutput(AVSync* avsync, AVRational time_base, AVFrameQueue* frame_queue, int video_width, int video_height);
    ~VideoOutput();
    int Init();
    int MainLoop();
    void RefreshLoopWaitEvent(SDL_Event* event);
private:
    void videoRefresh(double* remaining_time);
    AVFrameQueue* frame_queue = nullptr;
    SDL_Event event;
    SDL_Rect rect;
    SDL_Window* win = nullptr;
    SDL_Renderer* renderer = nullptr;
    SDL_Texture* texture = nullptr;

    AVSync* avsync = nullptr;
    AVRational time_base;

    int video_width = 0;
    int video_height = 0;
    uint8_t* yuv_buf = nullptr;
    int yuv_buf_size = 0;
};

#endif

パブリック メンバーは、コンストラクター、デストラクター、初期化関数、ループ関数、および待機関数です。

プライベートメンバーはたくさんいますので、この記事で分析してみましょう。

    void videoRefresh(double* Remaining_time); リフレッシュを担当する関数

    AVFrameQueue* Frame_queue = nullptr; ビデオ フレーム データ キュー

    SDL_Event イベント; SDL イベント

    SDL_Rect 長方形; SDL 長方形

    SDL_Window* win = nullptr; SDL ウィンドウ

    SDL_Renderer* レンダラー = nullptr; SDL レンダラー

    SDL_Texture* テクスチャ = nullptr; SDL テクスチャ

    AVSync* avsync = nullptr; オーディオとビデオの同期を担当するクラス

    AVRational time_base; タイムスタンプとフレーム レートの計算に使用されます

    int video_width = 0; ビデオウィンドウの幅

    int video_height = 0; ビデオウィンドウの高さ

    uint8_t* yuv_buf = nullptr; yuv データを格納する配列

    int yuv_buf_size = 0; yuv データを格納する配列の長さ

さて、この記事では VieoOutput クラスのプライベート メンバー変数について説明し、次の記事では関数の説明を始めます。

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

おすすめ

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