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
播放器控制
- 播放
- 暂停
- 停止
- 快进/快退
- 逐帧
- 静音
评论