Android OpenSL ES晶体频率

Android OpenSL ES晶体频率,android,audio,android-ndk,opensl,Android,Audio,Android Ndk,Opensl,我们有一个应用程序,使用低级别OpenSL ES编写移动音频客户端,以实现麦克风的低延迟输入。然后我们将以UDP数据报封装的10ms帧发送到服务器 在服务器上,我们正在进行一些后处理,这主要取决于aan的假设,即来自移动客户端的帧以固定的间隔出现(例如,每帧10毫秒),因此我们可以对齐它们 似乎手机内部的晶体频率变化很大,因此,我们在Begging上获得了完美的校准,但几分钟后校准不好 我知道,Linux上的ALSA可以告诉你们晶体的确切频率——所以你们可以根据这个来修正你们的计数。不幸的是,我

我们有一个应用程序,使用低级别OpenSL ES编写移动音频客户端,以实现麦克风的低延迟输入。然后我们将以UDP数据报封装的10ms帧发送到服务器

在服务器上,我们正在进行一些后处理,这主要取决于aan的假设,即来自移动客户端的帧以固定的间隔出现(例如,每帧10毫秒),因此我们可以对齐它们

似乎手机内部的晶体频率变化很大,因此,我们在Begging上获得了完美的校准,但几分钟后校准不好

我知道,Linux上的ALSA可以告诉你们晶体的确切频率——所以你们可以根据这个来修正你们的计数。不幸的是,我不知道如何在Android中获取这些信息


Thx的帮助

您所面临的问题的本质是,在具有不同本地振荡器的独立系统上有一个ADC和一个DAC。您可能正在根据第三个(可能是第四个)CPU时钟对数据包进行计时

这个问题的正确解决方案是某种算法。要正确地做到这一点,您需要一些方法来准确地对传输的数据包进行时间戳(例如,位精度),然后使用PLL来驱动接收器采样时钟的时钟速率。这正是IEEE1394音频和MPEG2传输流使用的方法

由于您可能无法完成这两项任务,因此您的方法很可能会涉及定期丢弃或重复样本(甚至整个数据包),以防止接收缓冲区流量不足或过大

USB音频同样缺乏对时钟恢复的硬件支持,使用的方法可能适用于您的情况

依靠网络数据包的传输和接收定时是一个糟糕的想法。交付时间的抖动是可怕的——尤其是Wifi或蜂窝连接。建议您使用完全不依赖它,而是像IEEE1394 audio和MPEG 2 TS一样,使用FIFO模型将音频数据传输与消费分离,在FIFO模型中,数据以恒定速率消费,并以不可靠的时间包传递给它


至于ALSA,它所能做的(除非有准确的外部定时基准)就是测量音频接口的采样时钟和CPU时钟之间的漂移。这不会产生任何东西的“精确频率”,因为两个振荡器都不可能是精确的,并且两者都可能随温度而漂移。

您所面临的问题的实质是,在具有不同本地振荡器的独立系统上有一个ADC和一个DAC。您可能正在根据第三个(可能是第四个)CPU时钟对数据包进行计时

这个问题的正确解决方案是某种算法。要正确地做到这一点,您需要一些方法来准确地对传输的数据包进行时间戳(例如,位精度),然后使用PLL来驱动接收器采样时钟的时钟速率。这正是IEEE1394音频和MPEG2传输流使用的方法

由于您可能无法完成这两项任务,因此您的方法很可能会涉及定期丢弃或重复样本(甚至整个数据包),以防止接收缓冲区流量不足或过大

USB音频同样缺乏对时钟恢复的硬件支持,使用的方法可能适用于您的情况

依靠网络数据包的传输和接收定时是一个糟糕的想法。交付时间的抖动是可怕的——尤其是Wifi或蜂窝连接。建议您使用完全不依赖它,而是像IEEE1394 audio和MPEG 2 TS一样,使用FIFO模型将音频数据传输与消费分离,在FIFO模型中,数据以恒定速率消费,并以不可靠的时间包传递给它

至于ALSA,它所能做的(除非有准确的外部定时基准)就是测量音频接口的采样时钟和CPU时钟之间的漂移。这不会产生任何东西的“精确频率”,因为两个振荡器都不可能精确,并且两者都可能随温度而漂移