一、目的
在之前的博文中我们分析过播放器整体的软件框架,本文在其基础上继续探讨数据缓冲机制。
二、设计
在播放设计中,我们需要考虑两类数据的调度管理,一类是事件类的管理,一类是音频数据的管理。
例如在网络流播放是,预处理线程发起HTTP请求,我们可以从HTTP请求的content-type头部中获取到音频格式信息,这样我们就可以通知解码线程进行解码器的初始化,当预处理线程获取到原始音频数据时就需要通过跨线程搬运的方式给解码线程去解码。
从上面的描述来看,设计一个跨线程的RINGBUFFER显得至关重要,其主要负责音频数据的同步与缓冲,那到底这个RINGBUFFER要有哪些功能呢?
分析这样一个场景,当预处理器(下载器)即生产者比较慢时(网络下载较慢),由于解码线程没有数据可以处理,那么播放线程也就没有数据可以播放;当网络不稳定时,我们就有可能听到明显的卡顿声;如果网络持续不稳定,我们可能就会听到断断续续的卡顿声。
再分析这样一个场景,当网络比较好的情况下,由于播放是一个较慢的操作(即必须按照采样率的速率去操作硬件设备),当生产者较快时,消费者必然来不及处理,此时由于内存的限制,我们不可能无限缓冲数据(这种情况尤其在内存较少的小平台系统上尤其突出)。
鉴于上面的分析,我们发现,我们要设计这样一个buffer,生产者慢时要缓存一定的数据后再开始播放,即要有蓄水