将录制的音频作为麦克风输入发送

14

我应该写些什么来以编程方式将录制的音频文件发送为安卓麦克风输入?

示例:

用户录制“你好,世界”。

然后他可以在通话中播放录音。


你能再解释一下吗?你想录制音频然后在通话期间重播吗?也就是说,你希望用户打电话,可能聊一会儿,然后能够按下按钮并重播他们之前录制的消息?还是你希望用户录制音频,然后将其作为整个通话本身?我自己在一个项目中完成了后者。 - RayfenWindspear
嗨,谢谢您的回复。任何一种方式都可以。我只需要知道如何播放音频文件并将其流式传输到麦克风,以便对方听到音频即可。谢谢。 - theAnonymous
啊,我的应用程序正在做一些不同的事情。我们正在通过Twilio API进行回放。根据多个来源,如果没有root权限,则无法将流式音频传输到通话中。显然这是Android本身的安全问题。请参见可能的重复内容https://dev59.com/R2435IYBdhLWcg3wtCSQ - RayfenWindspear
有没有可能将文件中的音频流直接输入到麦克风中,但不进行通话? - theAnonymous
你可以发送一个分享链接,将其重定向到音频源。 - Nandhu
不清楚你想要做什么,你尝试过什么吗?请贴出代码,并展示任何能帮助我们理解你想要实现的内容的截图。 - Maveňツ
2个回答

10

一旦您有了一个录制的文件,您可以将其作为InputStream或以任何其他方式打开。但是,如果您特别寻找像将音频注入正在运行的通话中这样的功能,那么这是不可能的。这是受到操作系统保护的。

除非您处理自定义ROM和修改过的内核,这并不是官方支持的。


1
是的,这是不可能的! - Gordon Freeman
1
但这意味着“自动应答机”类型的应用程序完全无法使用。 - Someone Somewhere
哦,我本以为这是可能的,因为有语音变声软件的存在。 - Boris
1
像 WhatsApp、Line 或 Facebook 这样的通话呢? - Ari Seyhun
@Acidic9 我的猜测也是不行,因为这个调用实际上是该应用程序的特定功能,是在该特定应用程序中以特定方式实现的Voip或某些网络调用,更改此行为将需要更改应用程序源代码或以某种方式管理将您的数据注入该网络连接,这比原始问题更难。 - Yazan

1

这可能会帮助您找到正确的方向。

使用AudioManager.OnAudioFocusChangeListener,您可以在下面的代码中获取audiomanager的状态 "focusChange=AUDIOFOCUS_LOSS_TRANSIENT"(当音乐正在后台播放时,任何来电都会调用此状态)。这个状态完全掌握在开发者手中,无论是播放还是暂停音乐。根据您的要求,如果您想在呼叫处于OFFHOOK状态时播放音乐,请不要在OFFHOOK状态下暂停播放音乐。而且只有在耳机禁用时才能实现这一点。

AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);

OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
    public void onAudioFocusChange(int focusChange) {
        if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT
            // Pause playback (during incoming call) 
        } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            // Resume playback (incoming call ends)
        } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
            am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
            am.abandonAudioFocus(afChangeListener);
            // Stop playback (when any other app playing music  in that situation current app stop the audio)
        }
    }
};

使用音频驱动程序的概念(这是针对Windows的,但可能适用于Android)
就像有些打印机驱动程序根本不连接打印机,而是写入PDF文件一样,类比地,还有虚拟音频驱动程序可用,它们根本不连接物理麦克风,但可以从其他来源(如文件或其他程序)输入数据。
我希望我没有违反任何规定,但VB-Audio Virtual Cable应该能让您创建一对虚拟输入和输出音频设备。然后,您可以将MP3文件播放到虚拟输出设备中,然后将虚拟输入设备设置为“麦克风”。理论上,我认为应该可以工作。
如果所有其他方法都失败了,您始终可以自己制作虚拟音频驱动程序。微软提供了一些示例代码,但遗憾的是,它不适用于旧版Windows XP音频模型。可能也有适用于XP的示例代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接