FFPlay项目VideoState详细解释
VideoState
结构体是 FFplay(FFmpeg 自带的播放器示例)中的核心数据结构之一,它负责维护播放器的整体状态,包括音视频解码、同步、渲染等功能。下面是对 VideoState
结构体中每个成员变量的详细解释:
线程控制与基本状态
SDL_Thread *read_tid;
- 读取线程(demux 线程)的指针,用于读取和解析输入媒体文件的数据。
const AVInputFormat *iformat;
- 指向输入格式的指针,例如 MP4、MKV、AVI 等。
int abort_request;
- 标志位,指示是否请求终止播放(例如用户主动退出)。
int force_refresh;
- 标志位,指示是否强制刷新视频画面。
int paused;
- 当前是否处于暂停状态(1:暂停,0:播放)。
int last_paused;
- 记录上一次暂停状态,防止状态变化时出现不同步问题。
int queue_attachments_req;
- 标志位,表示是否需要处理附件(如字幕、封面等)。
int seek_req;
- 是否请求跳转(seek),由用户操作触发。
int seek_flags;
- 跳转标志,决定跳转方式(如
AVSEEK_FLAG_BACKWARD
)。
- 跳转标志,决定跳转方式(如
int64_t seek_pos;
- 目标跳转的时间戳(单位:微秒)。
int64_t seek_rel;
- 以当前时间戳为基准的相对跳转时间(单位:微秒)。
int read_pause_return;
- 记录
av_read_pause()
的返回值,表示读取线程是否暂停。
- 记录
AVFormatContext *ic;
- 媒体文件的格式上下文,存储解封装器的信息,例如流、元数据等。
int realtime;
- 是否是实时流(如网络直播),决定播放器优化策略。
时钟同步(Clock 结构体)
Clock audclk;
- 音频时钟(音频播放时间基准)。
Clock vidclk;
- 视频时钟(视频播放时间基准)。
Clock extclk;
- 外部时钟(例如同步到系统时钟)。
解码 & 队列
FrameQueue pictq;
- 视频帧队列,存储解码后的图像帧。
FrameQueue subpq;
- 字幕帧队列,存储解码后的字幕帧。
FrameQueue sampq;
- 音频帧队列,存储解码后的音频帧。
Decoder auddec;
- 音频解码器。
Decoder viddec;
- 视频解码器。
Decoder subdec;
- 字幕解码器。
音频相关
int audio_stream;
- 选定的音频流索引。
int av_sync_type;
- 音视频同步类型(音频同步、视频同步、外部时钟同步)。
double audio_clock;
- 音频时钟(单位:秒),记录当前播放到的音频时间。
int audio_clock_serial;
- 音频时钟的序列号(区分不同的解码队列)。
double audio_diff_cum;
- 音视频差异的累计值,用于平滑计算音视频同步误差。
double audio_diff_avg_coef;
- 音频误差的加权系数。
double audio_diff_threshold;
- 音视频同步误差阈值。
int audio_diff_avg_count;
- 计算音视频同步误差的采样次数。
AVStream *audio_st;
- 指向当前播放的音频流。
PacketQueue audioq;
- 音频包队列,存储未解码的音频数据包(AVPacket)。
int audio_hw_buf_size;
- 硬件音频缓冲区大小(单位:字节)。
uint8_t *audio_buf;
- 存储解码后的音频数据(用于播放)。
uint8_t *audio_buf1;
- 备用音频缓冲区(用于音频重采样)。
unsigned int audio_buf_size;
- 当前音频缓冲区的大小(单位:字节)。
unsigned int audio_buf1_size;
- 备用缓冲区大小(单位:字节)。
int audio_buf_index;
- 当前音频缓冲区的读取位置(单位:字节)。
int audio_write_buf_size;
- 剩余未播放的音频数据大小(单位:字节)。
int audio_volume;
- 音量大小(范围 0-128)。
int muted;
- 是否静音(1:静音,0:正常)。
struct AudioParams audio_src;
- 音频源参数。
struct AudioParams audio_filter_src;
- 音频滤波器源参数。
struct AudioParams audio_tgt;
- 目标音频参数(最终播放的格式)。
struct SwrContext *swr_ctx;
- 音频重采样上下文。
视频 & 显示相关
int frame_drops_early;
- 早期丢帧计数(缓冲不足导致)。
int frame_drops_late;
- 后期丢帧计数(同步问题导致)。
enum ShowMode show_mode;
- 显示模式(视频、波形、频谱等)。
SDL_Texture *vis_texture;
- 可视化音频波形纹理。
SDL_Texture *sub_texture;
- 字幕纹理。
SDL_Texture *vid_texture;
- 视频纹理。
字幕相关
int subtitle_stream;
- 选定的字幕流索引。
AVStream *subtitle_st;
- 指向当前字幕流。
PacketQueue subtitleq;
- 字幕包队列。
视频播放控制
double frame_timer;
- 记录最后一帧播放时间(用于计算帧间隔)。
double frame_last_returned_time;
- 上一次返回视频帧的时间戳。
double frame_last_filter_delay;
- 最后一次滤波器处理的延迟。
int video_stream;
- 选定的视频流索引。
AVStream *video_st;
- 指向当前播放的视频流。
PacketQueue videoq;
- 视频包队列,存储未解码的视频数据包(AVPacket)。
double max_frame_duration;
- 允许的最大帧持续时间,超出则认为是时间戳跳变。
struct SwsContext *sub_convert_ctx;
- 字幕图像转换上下文(用于字幕格式转换)。
int eof;
- 是否到达文件末尾(1:是,0:否)。
文件 & 过滤器
char *filename;
- 播放的文件名。
int width, height, xleft, ytop;
- 视频窗口的尺寸和偏移。
int vfilter_idx;
- 视频滤镜索引。
AVFilterContext *in_video_filter, *out_video_filter;
- 视频滤波器链的输入和输出端。
AVFilterContext *in_audio_filter, *out_audio_filter;
- 音频滤波器链的输入和输出端。
AVFilterGraph *agraph;
- 音频滤波器图。
流切换
int last_video_stream, last_audio_stream, last_subtitle_stream;
- 记录上一次使用的音视频流索引。
SDL_cond *continue_read_thread;
- 读取线程的条件变量(用于线程同步)。