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;

    • 读取线程的条件变量(用于线程同步)。