buffer 流的常见处理策略
最近发现,无论音频还是图像,无论是 AI 识别,还是音视频编码,只要实时处理,都涉及一个关键场景:buffer 流的处理。
这里简单梳理下常见的处理策略。
FIFO 队列
多数情况下首先想到的策略,就是直接将数据放入队列,按照 FIFO 方式逐个处理。
但你有没有想过:每一帧真的都是非处理不可的么?
如果数据消费慢、生产快,就会造成队列阻塞(延迟),这在图像检测等实时场景是不可接受的:
丢帧策略
在上面提到的实时场景中,如果不是每个 buffer 都非处理不可,则可以选择丢弃策略:永远只处理最新的 buffer。
下面是采用了丢帧策略后的效果图:
环形 buffer
常用于音频处理(识别、编码等)场景。
因为音频回调的频率或者 buffer 大小可能是变化的(比如 iOS ReplayKit 就是如此),但人耳对声音比较敏感(不能忽快忽慢)。
所以需要一个大的环形 buffer 去缓冲,通过 timer 定时、定量去读取;新数据来了直接覆盖旧的。