Android> 4.0:想法如何logging/捕获内部audio(例如STREAM_MUSIC)?

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

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

内核模块工作,但有几个问题(内核版本,根特权等),所以我停止了这个工作。

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

谁有一个想法如何捕捉在Android的audio?

我有以下想法:

  1. 通过蓝牙连接到相同的手机,设置路由到BT,并抓住“另一端”的audio:这不应该工作

  2. 拦截与之前做的内核模块的audio:硬核,得到它的工作,但不适用

  3. 杰克audio连接套件 :可悲的Android使用“tinyALSA”,而不是“ALSA”。 TinyALSA不支持像JACK这样的filter(但是这带来了内核模块的想法)

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


编辑(忘记他们):

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

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


我刚刚findROUTE_TYPE_LIVE_AUDIO :

支持实时audio路由的设备将允许媒体audiostream路由到支持的目的地。 这可以包括设备本身的内置扬声器或audio插孔,A2DP设备等等。

启动后,此路由对应用程序是透明的。 媒体stream上播放的所有audio将被路由到选定的目的地。

也许这有助于任何方面?

我正在用尽想法,但想“破解这个坚果”,也许有人可以帮助我?

编辑:

我在C和内核编码方面真的很新颖(但是我成功地创build了一个交叉编译的audio拦截模块),但是不能以任何方式监听PCM数据从用户空间(JAVA ,C层?)到内核空间(tinyALSA,内核模块),而不是黑客和生根?

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

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

  2. 修改audiohttpstream地址到path是通过你的本地套接字服务器,例如地址

    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的响应,并将其传递给本地客户端(媒体播放器)。 这里你可以捕捉audiostream!