在 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 中核心功能的关键之一,它协调了解码、渲染、播放控制、线程同步和数据管理等操作,实现了媒体的解码和播放功能