java - 通过音频输入解码遥控代码

标签 java android

我目前正在编写一个用作网络 radio 的 Android 应用程序。该应用程序的部分功能是可以通过红外线 Remote 进行控制。红外遥控代码通过麦克风端口作为模拟音频输入。如果我记录一些信号并在 Audacity 中查看它们,我就很容易看出每个代码是什么。比如下面是0111111010011001011111101000001或者0x3F4CBF41。 enter image description here 我的问题是如何在这些信号进入时以编程方式检测它们并将它们转换为整数代码。我研究过一些打包的解决方案,如 LIRC,但它们是用 C 编写的,很难集成。在我看来,做这样简单的分析,native 也太过分了。我也查看了像 musicg 这样的库,但我找不到任何简单的方法来实时转换代码。

最佳答案

从您的问题中可以清楚地看出您熟悉 PWM 以及读取从 IR 接收器接收到的信号的方法。因此,我研究了如何使用 java 以一种可以像大胆窗口一样轻松解释的方法来存储数据。

javax.sound.sampled.spi 中有几个方法我认为这会有所帮助。

第一个是getAudioStream()AudioFileReader 中。这将返回一个 AudioStream,它还有一些可能有用的方法。我认为最适合您的目的是 read()它返回流中的下一个字节。如果更方便的话,您也可以提供一个字节数组来读取部分甚至整个流。

现在您有了一个字节列表或字节数组,您可以定期将它们解释为高电平或低电平(因为这是采样音频,每个字节之间的时间是恒定的)这就是 PWM 解码所需的一切!

通过找到近似端点,您可以将字节模式随时间转变为高/低持续时间模式。因为我知道你可以阅读(在你的问题中证明)我将跳过迂腐的转换,但是将 hhhlhllhhhhhhlllhh 转换为代码的十六进制表示是微不足道的。

TL;DR:捕获流,读取每个字节,通过时间转换,转换为二进制。

关于java - 通过音频输入解码遥控代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24845761/

相关文章:

java - 我如何水平放置 struts 2 元素?

java - 我需要在java中除以非常大的数字而不使用任何外部库(家庭作业)

java - 如何处理 SQLite 和 Android 的事务?

安装 WSL2 后,Android Studio 模拟器无法在 Windows 11 上运行

java - 如何在Hibernate中对关联映射表执行软删除?

java - 将 jdbc 与 hibernate 混合使用?

android - 使用 Material Design 当程序从启动器 Activity 转到另一个时应用程序崩溃

android - Spinner.getItemAtPosition(...) 返回什么类型的对象?

android - 如何在 Espresso 测试中重启 Android 应用程序?

java - 如何使用十六进制值比较字符串对象和文字