几个月前,在Android ICS(4.0)中,我开发了一个安卓内核模块,拦截了“pcmC0D0p”模块以获取所有系统音频。
我的目标是通过AirPlay将所有音频(或至少播放的音乐)流式传输到远程扬声器。
内核模块工作正常,但有几个问题(内核版本,root权限等),所以我停止了这个。
现在,我们有Android 4.1和4.2,我有了新的希望!
谁知道如何在Android中捕获音频?
我有以下想法:
Connect via bluetooth到同一部手机,设置路由到BT并抓住“另一端”的音频:这不应该有效
使用之前完成的内核模块拦截音频:硬核,让它工作但不适用
JACK Audio Connection Kit:遗憾的是Android使用“tinyALSA”而不是“ALSA”。 TinyALSA不支持任何像JACK这样的过滤器(但这带来了内核模块的想法)
使用PulseAudio代替AudioFlinger,但这也不适用
我从tinyALSA(Android上的ALSA)编译了“tinymix”(ALSA-mixer的婴儿版)并尝试将音频输出路由到麦克风输入 - 但没有成功( not understandable for me)。这也需要生根:不适用
我测试了OpenSL ES,但我不是C-crack而且它以“我可以录制麦克风,但没有更多”(也许我错了?)
我刚刚找到ROUTE_TYPE_LIVE_AUDIO:
支持实时音频路由的设备将允许媒体音频 将流路由到支持的目标。这可以包括 设备本身的内置扬声器或音频插孔,A2DP设备, 等等。
启动后,此路由对应用程序是透明的。所有 媒体流上播放的音频将路由到所选的 目的地。
也许这会有所帮助吗?
我的想法已经不多了但是想“破解这个坚果”,也许有人可以帮助我?
编辑:
我是C&内核编码(但我成功地创建了一个交叉编译的音频拦截模块) - 但是在PCM数据从用户空间(JAVA,C层?)转到内核空间(tinyALSA,内核模块),没有黑客攻击生根?
答案 0 :(得分:2)
您必须通过本地套接字服务器传递音频流量:
创建本地套接字服务器
将音频http流地址修改为路径是通过本地套接字服务器,例如地址
http://example.com/stream.mp3 ->
http://127.0.0.1:8888/http://example.com/stream.mp3
其中8888是您的套接字端口。
播放
http://127.0.0.1:8888/http://example.com/stream.mp3
使用默认媒体播放器
读取本地套接字服务器中对端口8888的所有传入请求,进行分析并传递给example.com服务器。
从example.com读取响应并将其传递给本地客户端(媒体播放器)。在这里你可以捕获音频流!