39

几个月前,我使用 Android ICS (4.0) 开发了一个 android 内核模块,它拦截“pcmC0D0p”模块以获取所有系统音频。

我的目标是通过 AirPlay 将所有音频(或至少播放的音乐)流式传输到远程扬声器。

内核模块可以工作,但是有几个问题(内核版本、root 权限等)所以我停止了这个工作。

现在,我们有了 Android 4.1 和 4.2,我有了新的希望!

谁知道如何在 Android 中捕获音频?

我有以下想法:

  1. 通过蓝牙连接 到同一部手机,将路由设置为 BT 并在“另一端”获取音频:这应该行不通

  2. 像以前一样使用内核模块拦截音频:hardcore,让它工作但不适用

  3. JACK 音频连接套件:遗憾的是,Android 使用“tinyALSA”而不是“ALSA”。TinyALSA 不支持任何像 JACK 这样的过滤器(但这带来了内核模块的想法)

  4. 使用 PulseAudio 作为 AudioFlinger 的替代品,但这也不适用


编辑(忘记他们):

  1. 我从tinyALSA (Android 上的 ALSA )编译了“tinymix”(ALSA 混音器的婴儿版),并尝试将音频输出路由到麦克风输入 - 但没有成功(我无法理解)。这也需要生根:不适用

  2. 我测试了OpenSL ES,但我不是 C-crack 并且它以“我可以录制麦克风,但没有更多”结束(也许我错了?)


我刚刚找到ROUTE_TYPE_LIVE_AUDIO

支持实时音频路由的设备将允许将媒体音频流路由到支持的目的地。这可以包括设备本身的内部扬声器或音频插孔、A2DP 设备等。

一旦启动,此路由对应用程序是透明的。媒体流上播放的所有音频都将路由到选定的目的地。

也许这有任何帮助?

我的想法不多了,但想“破解这个坚果”,也许有人可以帮助我?

编辑:

我真的是 C 和内核编码的新手(但我成功地创建了一个交叉编译的音频拦截模块) - 但在 PCM 数据从用户空间(JAVA ,C层?)到内核空间(tinyALSA,内核模块),没有黑客和生根?

4

1 回答 1

2

您必须通过本地套接字服务器传递音频流量:

  1. 创建本地套接字服务器

  2. 通过本地套接字服务器将音频 http 流地址修改为路径,例如地址

    http://example.com/stream.mp3  ->
    
    http://127.0.0.1:8888/http://example.com/stream.mp3
    

    其中 8888 是您的套接字端口。

  3. http://127.0.0.1:8888/http://example.com/stream.mp3 
    

    带默认媒体播放器

  4. 读取本地套接字服务器中对端口 8888 的所有传入请求,对其进行分析并传递给 example.com 服务器。

  5. 从 example.com 读取响应并将其传递给本地客户端(媒体播放器)。在这里您可以捕获音频流!

于 2013-07-03T10:07:12.767 回答