问题描述
Android中多个应用之间的麦克风音频输入共享
在处理当前应用程序时遇到了此问题,我想同时在两个(可以是多个)应用程序之间共享麦克风音频。
我尝试通过AudioRecord
类录制音频数据
audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC,44100,AudioFormat.CHANNEL_IN_STEREO,AudioFormat.ENCODING_PCM_16BIT,pcmBufferSize);
//for reading data
private ByteBuffer buffer = ByteBuffer.allocateDirect(BUFFER_SIZE); //define at class level
.
.
.
buffer.rewind();
audioRecord.read(buffer,buffer.remaining());
问题在于,当其他任何应用开始使用麦克风时,我们就会收到无声数据包。
Android 10(API级别29)及更高版本施加了优先级方案,可以在应用程序运行时在它们之间切换输入音频流。在大多数情况下,如果新应用获取了音频输入,则先前捕获的应用将继续运行,但会保持静音。在某些情况下,系统可以继续向两个应用程序传递音频。下面介绍了各种共享方案。
但是我看到许多应用程序共享音频输入而没有任何问题。例如Zoom,当正在进行缩放通话时,我启动了录音机,然后两个应用程序都获得了音频。(尽管缩放音频的强度降低了。)
另一个例子是Omlet Arcade,即使向其他应用程序提供了麦克风访问权限,他们也可以录制麦克风音频。例如:假设我正在通过Omlet Arcade播放一些大逃杀游戏,那么我的音频可以被我的队友(在游戏中)以及正在观看我的视频流的人听到。
因此,如果stackoverflow社区可以指导我寻求解决方案,那将非常有帮助。
解决方法
不确定您是否仅看一下引用的文档部分,但在下一部分中指定了为什么某些应用程序可以共享音频输入的原因:
有四种主要的[共享]方案:
- 助手+普通应用
- 无障碍服务+普通应用
- 两个普通应用
- 语音通话+普通应用
语音通话+普通应用:
如果from flask import Flask from werkzeug.middleware.dispatcher import DispatcherMiddleware from prometheus_client import make_wsgi_app # Create my app app = Flask(__name__) # Add prometheus wsgi middleware to route /metrics requests app.wsgi_app = DispatcherMiddleware(app.wsgi_app,{ '/metrics': make_wsgi_app() })
返回的音频模式是MODE_IN_CALL或MODE_IN_COMMUNICATION,则语音呼叫处于活动状态。
Android根据以下规则共享输入音频:
- 该呼叫始终会接收音频。
- 如果该应用是具有权限CAPTURE_AUDIO_OUTPUT的特权(预安装)应用,则该应用可以捕获语音呼叫。
- 该应用可以捕获音频(如果它是一项辅助功能)。
要捕获语音呼叫的上行链路(TX),下行链路(RX)或两者,应用必须指定音频源
AudioManager.getMode()
或MediaRecorder.AudioSource.VOICE_UPLINK
和/或设备MediaRecorder.AudioSource.VOICE_DOWNLINK
再次向下,它指定如何在Android 11中为录制的音频设置隐私敏感度级别,例如将其设置为“不敏感”可将音频与其他应用共享。希望这有助于了解从哪里开始