首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓OpenSL ES晶体频率

安卓OpenSL ES晶体频率
EN

Stack Overflow用户
提问于 2013-07-09 01:23:36
回答 1查看 310关注 0票数 0

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

在服务器上,我们正在做一些后处理,这依赖于一个假设,即来自移动客户端的帧以固定的间隔到来(例如,每帧10毫秒),所以我们可以对齐它们。

看起来手机内部的晶体频率可能会有很大的变化,因此,我们在几分钟后就会得到完美的对准,但不太对准。

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

Thx请求帮助

EN

回答 1

Stack Overflow用户

发布于 2013-07-09 07:08:56

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

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

由于这两件事可能都做不到,因此您的方法很可能涉及定期丢弃或重复采样(甚至整个数据包),以防止接收缓冲区下溢或溢出。

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

依靠网络数据包的发送和接收定时是一个糟糕的想法。交付时间的抖动是可怕的-特别是在Wifi或蜂窝连接的情况下。您最好使用它,而不是像IEEE1394音频和MPEG2TS做的那样做,这是解耦音频数据传输与使用模型先进先出,其中数据以恒定的速率消耗,并以不可靠的定时分组传递给它。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17532520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档