Android> 4.0:想法如何录制/捕获内部音频(例如STREAM_MUSIC)?

Mar*_* L. 39 audio android alsa capture

几个月前,在Android ICS(4.0)中,我开发了一个安卓内核模块,它拦截了"pcmC0D0p"模块以获取所有系统音频.

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

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

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

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

我有以下想法:

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

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

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

  4. 使用PulseAudio代替AudioFlinger,但这也不适用


编辑(忘了他们):

  1. 我从tinyALSA(Android上的ALSA )编译了"tinymix"(ALSA-mixer的婴儿版)并试图将音频输出到麦克风输入 - 但没有成功(对我来说不可理解).这也需要生根:不适用

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


我刚刚找到了ROUTE_TYPE_LIVE_AUDIO:

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

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

也许这有助于任何方式?

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

编辑:

我是C和内核编码的新手(但我成功地创建了一个交叉编译的音频拦截模块) - 但是在用户空间(JAVA)发送PCM数据的时候,它是不是可以用来监听,C层?)到内核空间(tinyALSA,内核模块),没有黑客攻击和生根?

Nik*_*Nik 2

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

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

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

    http://example.com/stream.mp3  ->
    
    http://127.0.0.1:8888/http://example.com/stream.mp3
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. http://127.0.0.1:8888/http://example.com/stream.mp3 
    
    Run Code Online (Sandbox Code Playgroud)

    使用默认媒体播放器

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

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

  • 如果我理解正确的话,您几乎会推荐一个捕获代理。虽然它可能对远程音频的初始加载有所帮助,但这并不能以任何方式解决 OP 的问题。只是将这条评论放在这里,因为赏金让我误以为这是一个可接受的答案,希望提及它可以节省其他人一些时间。 (3认同)