buffer 流的常见处理策略

最近发现,无论音频还是图像,无论是 AI 识别,还是音视频编码,只要实时处理,都涉及一个关键场景:buffer 流的处理。

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

FIFO 队列

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

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

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

丢帧策略

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

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

环形 buffer

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

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

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

参考: