buffer 流的常见处理策略

最近发现,无论是之前做的语音和图像识别,还是最近做的视频直播,都涉及到一个场景:

buffer 流的处理。

所以这里简单梳理下常见的处理策略。

FIFO 队列

多数情况下首先想到的策略,就是直接将数据放入队列,按照 FIFO 方式逐个处理。

但你有没有想过:每一帧真的都是非处理不可的么?

如果数据消费慢、生产快,就会造成队列阻塞(延迟),这在图像检测等实时场景是不可接受的:



丢帧策略

在上面提到的实时场景中,如果不是每个 buffer 都非处理不可,则可以选择丢弃策略:永远只处理最新的 buffer。

下面是采用了丢帧策略后的效果图:



环形 buffer

常用于音频处理(识别、编码等)场景。

因为音频回调的频率或者 buffer 大小可能是变化的(比如 iOS ReplayKit 就是如此),但人耳对声音比较敏感(不能忽快忽慢)。

所以需要一个大的环形 buffer 去缓冲,通过 timer 定时、定量去读取;新数据来了直接覆盖旧的。

参考: