你能告诉我在linux上的c中实现输入和输出之间具有恒定时间延迟的循环缓冲区的最佳方法吗?我在一个线程中写入缓冲区并在另一个线程上读取它。我需要保存读取和写入之间的恒定时间差,并且写入流具有可变比特率。现在,我每隔几个数据包添加时间戳来同步它们,并且每 1 毫秒从另一个使用 Clock_gettime 的线程获取时间戳。
最佳答案
按照您的建议,总体方法是正确的。不过,还有很多事情需要注意 -
源线程提交到CBuf,接收线程从CBuf删除。
CBuf 必须足够大,以免数据丢失。
CBuf 必须被两个线程锁定以确保不会损坏。
CBuf 数据必须带有时间戳。该时间戳必须足够准确,不会导致传输抖动。
接收器线程必须延迟以确保它不会流量不足。
源线程和接收器线程必须仅从公共(public)时间源获取时间,以便它们各自的流入和流出速率之间不存在漂移。
如果您正在考虑将其传输到外部的某个硬件系统,则 1 毫秒的时间戳精度相当低,因为 MPEG 传输合规性需要 500 纳秒。但是,如果您使用硬件适配器进行传输,那么通常它会处理它。
关于用于 mpeg-ts 的具有恒定时间延迟的 c 循环缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9823083/