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 つであり、デコード、レンダリング、再生制御、スレッド同期、データ管理などの操作を調整し、メディアのデコードおよび再生機能を実現します。