ffplay源码分析(二)结构体VideoState

打印 上一主题 下一主题

主题 550|帖子 550|积分 1650

在多媒体的天下里,播放器是离用户近来的一环,它将数字编码的音频和视频数据转化为生动的视听体验。ffplay 播放器作为一款强大而备受关注的工具,其背后隐藏着一系列精妙的结构体,它们协同工作,共同完成了从数据读取、解码、渲染到终极呈现的复杂流程。
以下是播放器的一个简单的流程,

当我们启动 ffplay 播放器,它首先会与数据源建立连接,无论是当地文件、网络流还是其他输入源。。紧接着,数据被源源不停地送入解码器,将压缩编码的数据转换为可处理的原始格式。
在这一流程中,各种关键的结构体开始发挥作用。它们像是经心设计的齿轮,紧密咬合,驱动着播放器的每一个环节。分析源码时,结构体就像是源码的目录,可以对整个播放器的运作流程有一个简单的理解。所以看这部分的内容时,不用纠结于每一个字段的意义,有一个大概的印象即可。
ffplay的核心:VideoState

以下是添加了具体表明的结构体 VideoState:
  1. typedef struct VideoState {
  2.     SDL_Thread *read_tid;     // 读线程的线程ID
  3.     const AVInputFormat *iformat;     // 输入格式
  4.     int abort_request;    // 中断请求标志
  5.     int force_refresh;     // 强制刷新标志
  6.     int paused;           // 播放是否暂停标志
  7.     int last_paused;      // 上一次的暂停状态
  8.     int queue_attachments_req; // 是否请求附带图片(如MP3或AAC文件的专辑封面等)
  9.     int seek_req;         // 是否请求跳转
  10.     int seek_flags;       // 跳转标志
  11.     int64_t seek_pos;     // 跳转位置
  12.     int64_t seek_rel;     // 跳转相对位置
  13.     int read_pause_return; // 发送暂停请求的结果(例如RTSP暂停消息是否成功)
  14.     AVFormatContext *ic;     // 格式上下文
  15.     int realtime;         // 是否为实时播放
  16.   
  17.     Clock audclk;         // 音频时钟
  18.     Clock vidclk;         // 视频时钟
  19.     Clock extclk;         // 外部时钟
  20.   
  21.     FrameQueue pictq;     // 图像帧队列
  22.     FrameQueue subpq;     // 字幕帧队列
  23.     FrameQueue sampq;     // 音频采样帧队列
  24.   
  25.     Decoder auddec;       // 音频解码器
  26.     Decoder viddec;       // 视频解码器
  27.     Decoder subdec;       // 字幕解码器
  28.   
  29.      /*******************音视频同步相关************************/
  30.     int audio_stream;     // 音频流的索引
  31.     int av_sync_type;     // 音视频同步类型
  32.     double audio_clock;   // 当前音频时钟值
  33.     int audio_clock_serial; // 音频时钟序列号
  34.     double audio_diff_cum; // 音频差异累计值(用于计算平均差异)
  35.     double audio_diff_avg_coef; // 音频差异平均系数
  36.     double audio_diff_threshold; // 音频差异阈值
  37.     int audio_diff_avg_count;    // 音频差异平均计数
  38.   
  39.   
  40.     AVStream *audio_st;  // 音频流
  41.     PacketQueue audioq;  // 音频包队列
  42.     int audio_hw_buf_size;  // 音频硬件缓冲区大小
  43.     uint8_t *audio_buf;     // 音频缓冲区
  44.     uint8_t *audio_buf1;    // 重采样音频缓冲区
  45.     unsigned int audio_buf_size; // 音频缓冲区大小(字节)
  46.     unsigned int audio_buf1_size; // 重采样音频缓冲区大小(字节)
  47.     int audio_buf_index;   // 音频缓冲区播放位置
  48.     int audio_write_buf_size; // 当前音频缓冲区中未播放的数据大小
  49.     int audio_volume;      // 音频音量
  50.     int muted;             // 是否静音
  51.     struct AudioParams audio_src; // 音频源参数
  52.     struct AudioParams audio_filter_src; // 音频滤波源参数
  53.     struct AudioParams audio_tgt; // 音频目标参数
  54.     struct SwrContext *swr_ctx;  // 音频重采样上下文
  55.     int frame_drops_early; // 解码器队列中由于同步问题而提前丢弃的帧
  56.     int frame_drops_late;  // 由于播放延迟而丢弃的帧
  57.     enum ShowMode {
  58.         SHOW_MODE_NONE = -1, SHOW_MODE_VIDEO = 0, SHOW_MODE_WAVES, SHOW_MODE_RDFT, SHOW_MODE_NB
  59.     } show_mode;          // 显示模式
  60.   
  61.     /*******************音频可视化相关************************/
  62.     int16_t sample_array[SAMPLE_ARRAY_SIZE]; // 音频可视化数据
  63.     int sample_array_index;  // 音频可视化数据索引
  64.     int last_i_start; // 上一次计算的音频显示起始索引
  65.     AVTXContext *rdft;     // 快速傅里叶变换上下文
  66.     av_tx_fn rdft_fn;     // 快速傅里叶变换函数指针
  67.     int rdft_bits;       // 快速傅里叶变换的位数
  68.     float *real_data;    // 实部数据
  69.     AVComplexFloat *rdft_data; // 复数数据
  70.     int xpos;            // x 位置
  71.     double last_vis_time; // 上一次可视化时间
  72.   
  73.     /*******************渲染纹理相关************************/
  74.     SDL_Texture *vis_texture; // 音频可视化纹理
  75.     SDL_Texture *sub_texture; // 字幕纹理
  76.     SDL_Texture *vid_texture; // 视频纹理
  77.   
  78.   
  79.     int subtitle_stream; // 字幕流的索引
  80.     AVStream *subtitle_st; // 字幕流
  81.     PacketQueue subtitleq; // 字幕包队列
  82.     double frame_timer;  // 帧定时器
  83.     double frame_last_returned_time; // 上一帧的显示时间戳
  84.     double frame_last_filter_delay; // 上一帧的滤镜延迟
  85.     int video_stream;    // 视频流的索引
  86.     AVStream *video_st;  // 视频流
  87.     PacketQueue videoq;  // 视频包队列
  88.     double max_frame_duration; // 最大帧持续时间
  89.     struct SwsContext *sub_convert_ctx; // 字幕转换上下文
  90.     int eof;             // 文件结束标志
  91.     char *filename;      // 文件名
  92.   
  93.     int width;          // 播放窗口宽度
  94.     int height;         // 播放窗口高度
  95.   
  96.     int xleft;          // 显示区域的左偏移
  97.     int ytop;           // 显示区域的上偏移
  98.     int step;           // 步进模式(单帧模式)
  99.     int vfilter_idx;    // 视频滤镜索引
  100.     AVFilterContext *in_video_filter; // 视频输入滤镜上下文
  101.     AVFilterContext *out_video_filter; // 视频输出滤镜上下文
  102.     AVFilterContext *in_audio_filter; // 音频输入滤镜上下文
  103.     AVFilterContext *out_audio_filter; // 音频输出滤镜上下文
  104.     AVFilterGraph *agraph; // 音频滤镜图
  105.     int last_video_stream; // 上一次的视频流索引
  106.     int last_audio_stream; // 上一次的音频流索引
  107.     int last_subtitle_stream; // 上一次的字幕流索引
  108.     SDL_cond *continue_read_thread; // 读线程条件变量
  109. } VideoState;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

滴水恩情

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表