11111 咩咩到此一游 1111

播放器初始化

  • 初始化 packet queue
  • 初始化 frame queue
  • 初始化 clock
  • 创建数据读取线程

现成的划分

  • 数据读取线程

  • 打开媒体文件

  • 打开对应码流的 decoder 以及初始化对应的 audio、video、subtitle 输出

  • 创建 decoder 线程,audio、video 和 subtitle 的解码线程独立

  • 调用 av_read_frame 读取 packet,并根据 stream_index 放入不同 stream 对应的 packet 队列

  • 音频解码

  • 从 packet queue 读取 packet,解码出 frame 后放入 frame queue

  • 视频解码

  • 从 packet queue 读取 packet,解码出 frame 后放入 frame queue

  • 字幕解码

  • 从 packet queue 读取 packet,解码出 frame 后放入 frame queue

  • 音频播放(或者回调函数)

  • 从 frame queue 读取 frame 进行播放

  • 视频播放(ffplay 目前是在 main 主线程进行视频播放)

  • 从 frame queue 读取 frame 进行播放

  • 字幕播放(ffplay 目前是在 main 主线程进行字幕播放)

  • 从 frame queue 读取 frame 进行播放

  • 控制响应(播放/暂停/快进/快退等)(ffplay 目前是在 main 主线程进行播放控制的)

packet 队列的设计

  • 线程安全:支持互斥、等待、唤醒
  • 缓存数据大小
  • 缓存包数
  • 队列播放可持续时间
  • 进队列/出队列等

frame 队列的设计

  • 线程安全:支持互斥、等待、唤醒
  • 缓存帧数
  • 支持读取数据而不出队列
  • 进队列/出队列

音视频同步

  • 音频同步
  • 视频同步
  • 外部时钟同步

音频处理

  • 音量调节
  • 静音
  • 重采样

视频处理

  • 图像格式转换 YUV->RGB 等
  • 图像缩放 1280720->800480

播放器控制

  • 播放
  • 暂停
  • 停止
  • 快进/快退
  • 逐帧
  • 静音