【问题标题】:Record audio from various internal devices in Android (via undocumented API)在 Android 中录制来自各种内部设备的音频(通过未记录的 API)
【发布时间】:2011-06-04 22:11:20
【问题描述】:

我想知道是否可以从系统输出、FM 收音机、蓝牙耳机等其他来源捕获音频数据。我对从 FM 收音机捕获音频特别感兴趣,并且已经研究了所有可能性,包括尝试不走运地嗅探手机和无线电设备之间的原始蓝牙通信。太糟糕了,Android 只允许从 MIC 录制音频。

我查看了 Android 源代码,但找不到后门可以让我在不root 设备的情况下执行此操作。至少,您是否知道如何使用其他设备(可能以某种方式访问​​ /dev/audio)例如通过 NDK 或更好的方式 - Java(可能是反射?)来欺骗系统以捕获来自调频收音机的音频流。 (就我而言,我正在尝试为 HTC Desire 开发应用程序)

PS。对于那些反对使用未记录 API 的人,请不要在此处发布 - 我正在编写一个供我个人使用的应用程序,或者即使我发布了它,我也会警告用户可能存在的不兼容性。

【问题讨论】:

    标签: audio android-ndk radio android


    【解决方案1】:

    我花了相当长的时间来破译音频堆栈,我认为你可能会尝试劫持 libaudio。您将无法直接与硬件 (/dev/*) 对话,因为许多设备使用专有的音频驱动程序。这方面没有规定。

    但是,/system/lib/libaudio.so 提供的音频硬件抽象层 (HAL)应该公开http://source.android.com/porting/audio.html中描述的 API

    Android 系统,尤其是 audioflinger,使用这个 libaudio HAL 来查找可用设备、处理路由,当然还有读/写 PCM 数据。

    因此,您可以通过重命名后者来劫持 audioflinger 和 libaudio 之间的交互,并提供您自己的 libaudio 来装饰真实的 libaudio。这样做,您应该能够记录发生的事情并很可能截获 FM 无线电输出,前提是这不是由硬件直接处理的。

    当然,这一切都需要生根。如果你能做到这一点,请发表评论,这让我很感兴趣。

    【讨论】:

    • 嗯,这可能是可能的,但正如我上面提到的我不喜欢生根(我还没有植根我的手机,这不是一个真正的问题)。无论如何,我会再等一会儿,如果没有其他建议如何在不生根的情况下做到这一点,我可以试试你的(并接受你的解决方案)。
    • 除了root之外,我能想到的唯一后门是尝试嗅探audioflinger和各个客户端(audio_track_cblk_t)之间的共享内存。但我真的怀疑这是可能的,而且无论如何它都不会让你访问全局系统输出。
    • 所有支持 Fm 的 OEM 都会为您提供一个音频源 ID。通过使用它,我们可以录制 FM。但这里真正的问题是隐藏了音频源 ID。我尝试了一些随机数,令人惊讶的是 9 适用于三星和摩托罗拉等设备,但不是全部。我仍在寻找所有 OEM 的音频源 ID。
    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多