【发布时间】:2011-03-11 04:32:02
【问题描述】:
我正在尝试在 Android 上通过电话发送音频流。
例如,创建一个可以播放一些自定义保留音乐或接听电话并播放录音/音频文件的应用。我知道可以让应用自动接听电话,但它可以向来电者发送音频吗?
如果可能的话,请告诉我哪些类/函数可以处理这个问题。
【问题讨论】:
标签: android audio phone-call
我正在尝试在 Android 上通过电话发送音频流。
例如,创建一个可以播放一些自定义保留音乐或接听电话并播放录音/音频文件的应用。我知道可以让应用自动接听电话,但它可以向来电者发送音频吗?
如果可能的话,请告诉我哪些类/函数可以处理这个问题。
【问题讨论】:
标签: android audio phone-call
可以写入电话流是,但不能从普通(非root)手机上的应用程序级别写入。
当发起电话呼叫时,麦克风“通常”(实际上取决于特定的电话)直接路由到基带,即完全跳过主处理器。
对于传出音频:mic->codec->baseband 对于传入的音频:基带->编解码器->扬声器
如果总是路由:mic->codec->mainprocessor->codec->baseband
如果 Android API(框架)支持访问该流,则该流“可能”可用。
我之所以说这是可能的,是因为音频(现在几乎所有智能手机)都是通过SlimBus 连接的,这允许动态更改音频路径。然而,它是通过位于ALSA 中的编解码器驱动程序在内核中完成的。
所以....如果您有这么大的动力,您可以获取电话的 Linux 内核源代码并修改编解码器/ALSA 驱动程序,以允许您更改设置呼叫音频路径时发生的情况。
当然,新路径会导致延迟,打破 AT&T 设置的呼叫/延迟标准(Audience 帮助他们编写...),并且基带芯片可能会拒绝您的音频,因为它不及时。
最后,您需要修改 Android 源代码(框架)以扩展 API 以支持将音频注入该流。 (您需要对 mediaserver 进行大型 mods,尤其是 audioflinger...)
这很复杂,但有你的答案。干杯,:-)
【讨论】:
这一定是可能的,因为手机将允许蓝牙将音频作为麦克风发送。
由于我需要解决这个问题,我的一个想法是本质上向自己发送一个蓝牙信号作为麦克风输入“隐形”。
另一个想法(如果很糟糕,请道歉)是将扬声器反转为麦克风。由于扬声器似乎可以访问所需的硬件,因此可能有一种方法可以通过这种方式注入音频数据流。
由于我对使用 SDK 在 Android 上进行编码完全不熟悉,请原谅本文最初的拙劣之处,我会在我/我们弄清楚这一点时进行更新。
【讨论】:
我知道apps 已经将all 系统音频发送到手机的earpiece,甚至是您在没有root 或任何其他特殊权限的情况下在媒体播放器中播放的歌曲。
经过一番研究,我发现可以使用Audio Manager 类来完成。例如
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(false);
为什么不将默认输出扬声器设置为设备听筒,然后使用MediaPlayer 类播放音频?
【讨论】:
捕获远程子混音音频需要 CAPTURE_AUDIO_OUTPUT 权限。此权限仅供系统组件使用,第三方应用程序不可用:(
【讨论】:
获取音频数据是非常可能的,但是将音频写入上行通道,这是不可能的
【讨论】:
无法写入电话流,抱歉。
【讨论】: