在ffplayer中,VideoState结构体的定义主要成员如下:
typedef struct VideoState {
Clock audclk;
Clock vidclk;
Clock extclk;
FrameQueue pictq;
FrameQueue subpq;
FrameQueue sampq;
Decoder auddec;
Decoder viddec;
Decoder subdec;
PacketQueue audioq;
PacketQueue subtitleq;
PacketQueue videoq;
int seek_req;
double frame_timer;
int abort_request;
int force_refresh;
int paused;
}
这个结构体 VideoState 是在 ijkplayer 中用于表示视频状态的关键组件之一。下面对该结构体进行详细分析,并说明其在 ijkplayer 中的作用:
Clock audclk
:音频时钟,用于记录音频的当前播放时间。
Clock vidclk
:视频时钟,用于记录视频的当前播放时间。
Clock extclk
:外部时钟,用于记录其他外部时钟源的当前播放时间,如外部同步时钟。
FrameQueue pictq
:视频帧队列,用于存储待渲染的视频帧。
FrameQueue subpq
:字幕帧队列,用于存储待显示的字幕帧。
FrameQueue sampq
:音频样本队列,用于存储待播放的音频样本。
Decoder auddec
:音频解码器,用于进行音频解码操作。
Decoder viddec
:视频解码器,用于进行视频解码操作。
Decoder subdec
:字幕解码器,用于进行字幕解码操作。
PacketQueue audioq
:音频数据包队列,用于存储待解码的音频数据包。
PacketQueue subtitleq
:字幕数据包队列,用于存储待解码的字幕数据包。
PacketQueue videoq
:视频数据包队列,用于存储待解码的视频数据包。
int seek_req
:标志是否有进行跳转的请求。
double frame_timer
:视频帧显示的时间。
int abort_request
:标志是否有中止播放的请求。
int force_refresh
:标志是否强制刷新视频显示。
int paused
:标志是否处于暂停状态。
VideoState 结构体中的成员变量组合在一起,用于管理和控制视频播放的状态和数据。它包含了音频和视频的时钟用于同步、帧队列用于存储待处理的帧、解码器用于进行音视频解码、数据包队列用于存储待解码的数据包,以及一些标志位和控制参数等。通过这些成员变量,VideoState 结构体实现了视频的解码、同步、播放和渲染等功能,以保证音视频的顺序和同步性,并控制播放过程中的跳转、暂停和中止等操作。