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

时间:2012-12-27 13:09:23

标签: android audio capture alsa

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

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

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

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

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

我有以下想法:

  1. Connect via bluetooth到同一部手机,设置路由到BT并抓住“另一端”的音频:这不应该有效

  2. 使用之前完成的内核模块拦截音频:硬核,让它工作但不适用

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

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


  5. 编辑(忘了他们):

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

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


    3. 我刚刚找到ROUTE_TYPE_LIVE_AUDIO

        

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

           

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

      也许这会有所帮助吗?

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

      编辑:

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

1 个答案:

答案 0 :(得分: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读取响应并将其传递给本地客户端(媒体播放器)。在这里你可以捕获音频流!