我们有一个用低级OpenSL ES编写的移动音频客户端的应用程序,以实现麦克风的低延迟输入。然后我们将封装在UDP数据报中的10ms帧发送到服务器。
在服务器上,我们正在做一些后处理,这依赖于一个假设,即来自移动客户端的帧以固定的间隔到来(例如,每帧10毫秒),所以我们可以对齐它们。
看起来手机内部的晶体频率可能会有很大的变化,因此,我们在几分钟后就会得到完美的对准,但不太对准。
我知道,Linux上的ALSA可以告诉你晶体的确切频率--所以你可以根据这个来修正你的计数。不幸的是,我不知道如何在Android中获取这些信息。
Thx请求帮助
发布于 2013-07-09 07:08:56
您面临的问题的实质是,您在具有不同本地振荡器的不同系统上有一个ADC和一个DAC。您可能正在根据第三个(也可能是第四个) CPU时钟对数据包进行计时。
这个问题的正确解决方案是某种clock recovery算法。为了正确地做到这一点,您需要一些方法来精确地标记传输的数据包的时间戳(例如,比特精确度),然后使用PLL来驱动接收器采样时钟的时钟频率。这正是IEEE1394音频和MPEG2传输流都使用的方法。
由于这两件事可能都做不到,因此您的方法很可能涉及定期丢弃或重复采样(甚至整个数据包),以防止接收缓冲区下溢或溢出。
USB Audio同样缺乏对时钟恢复的硬件支持,这里使用的方法可能适用于您的情况。
依靠网络数据包的发送和接收定时是一个糟糕的想法。交付时间的抖动是可怕的-特别是在Wifi或蜂窝连接的情况下。您最好使用它,而不是像IEEE1394音频和MPEG2TS做的那样做,这是解耦音频数据传输与使用模型先进先出,其中数据以恒定的速率消耗,并以不可靠的定时分组传递给它。
对于ALSA,它所能做的就是测量音频接口的采样时钟和CPU时钟之间的漂移(除非if有一个准确的外部时序基准)。这不会产生任何东西的“确切频率”,因为这两个振荡器都不太可能是准确的,而且两个振荡器都可能根据温度而漂移。
https://stackoverflow.com/questions/17532520
复制相似问题