ijkplayer 学習の FFPlayer 構造

ijkplayer では、FFPlayer 構造は、オーディオ データとビデオ データをデコードして再生するための基礎となるコア プレーヤーです。メンバーについては以下で詳しく説明します。

typedef struct FFPlayer {
    
    
    // 视频和音频解码器
    AVCodecContext *video_codec;  // 视频解码器上下文
    AVCodecContext *audio_codec;  // 音频解码器上下文

    // 音视频渲染器
    IJKFFVout *ff_vout;           // 视频渲染器
    SDL_AudioDeviceID audio_device_id;  // 音频设备ID

    // 解封装器、解码器和过滤器队列
    FrameQueue frameq;            // 音视频帧队列
    PacketQueue videoq;           // 视频数据包队列
    PacketQueue audioq;           // 音频数据包队列
    PacketQueue subtitleq;        // 字幕数据包队列

    // 播放控制相关
    int abort_request;            // 请求中止播放
    int pause_req;                // 请求暂停播放
    int paused;                   // 播放器是否处于暂停状态
    int seek_req;                 // 跳转请求
    int seek_flags;               // 跳转标志位
    int64_t seek_pos;             // 跳转位置
    int eof;                      // 是否已到达媒体末尾
    int error;                    // 播放错误
    int prepared;                 // 是否准备好播放

    // 封装器上下文和解码器上下文
    AVFormatContext *ic;          // 封装器上下文
    AVFormatContext *iformat;     // 输入封装器上下文
    AVInputFormat *input_format;  // 输入封装器
    AVIOContext *io_context;      // IO上下文

    // 线程
    SDL_Thread *read_tid;         // 读取数据的线程
    SDL_Thread *video_tid;        // 视频解码的线程
    SDL_Thread *audio_tid;        // 音频解码的线程

    // 时钟和同步
    SDL_mutex *play_mutex;        // 播放互斥锁
    SDL_cond *continue_read_thread;  // 继续读取数据的条件变量
    SDL_cond *continue_video_thread; // 继续视频解码的条件变量
    SDL_cond *continue_audio_thread; // 继续音频解码的条件变量
    SDL_cond *read_thread_over;   // 读取线程结束的条件变量

    // 其他信息
    int64_t start_time;           // 媒体文件的起始时间
    int64_t duration;             // 媒体文件的时长
    AVRational tb_start_time;     // 媒体文件的起始时间基准
    AVRational tb_duration;       // 媒体文件的时长基准
    double max_frame_duration;    // 最大帧时长
    int step;                     // 单步播放

    // 回调函数和回调上下文
    ijk_inject_callback inject_callback;   // 注入数据的回调函数
    void *inject_callback_data;  // 注入数据的回调函数的上下文
    void *opaque;                // 用户自定义数据

    // 线程销毁
    int join_video_tid;           // 视频线程结束标志
    int video_tid_valid;          // 视频线程有效标志
    int join_audio_tid;           // 音频线程结束标志
    int audio_tid_valid;          // 音频线程有效标志
} FFPlayer;

FFPlayer 構造には、デコード、レンダリング、再生制御、スレッド操作、クロック同期、関連するコールバック関数などを管理するための複数のメンバー変数が含まれています。これらのメンバー変数の役割は次のとおりです。

video_codec 和 audio_codec: ビデオおよびオーディオ コーデックのコンテキスト。
ff_vout 和 audio_device_id: ビデオとオーディオのレンダラー/デバイス。
frameq、videoq、audioq 和 subtitleq: オーディオおよびビデオ フレーム キューおよびデータ パケット キュー。デコードおよびレンダリングされるオーディオおよびビデオ フレームとデータ パケットを保存するために使用されます。
abort_request、pause_req、paused、seek_req、seek_flags、seek_pos、eof、error 和 prepared: プレーヤーのステータスと再生制御を制御するために使用されます。
ic、iformat、input_format 和 io_context: ラッパーのラップ解除と入力に使用されるコンテキスト。
read_tid、video_tid 和 audio_tid: データの読み取り、ビデオのデコード、およびオーディオのデコードのためのスレッド。
play_mutex、continue_read_thread、continue_video_thread、continue_audio_thread 和 read_thread_over: スレッド同期とミューテックス アクセスのためのミューテックスと条件変数。
start_time、duration、tb_start_time、tb_duration 和 max_frame_duration: メディア ファイルの開始時間、継続時間、および関連するクロック情報。
step:シングルステップ再生のサインです。
inject_callback、inject_callback_data 和 opaque: データおよびユーザー定義データを注入するためのコールバック関数とコンテキスト。
join_video_tid、video_tid_valid、join_audio_tid 和 audio_tid_valid: スレッド破壊関連のフラグ。

FFPlayer 構造は、ijkplayer の中核機能の鍵の 1 つであり、デコード、レンダリング、再生制御、スレッド同期、データ管理などの操作を調整し、メディアのデコードおよび再生機能を実現します。

おすすめ

転載: blog.csdn.net/qq_51282224/article/details/131653213