TL;博士
如何在 WebRTC 呼叫中路由远程参与者的语音,以便 Streamlabs 或类似的流应用程序将其视为内部声音?
说来话长
我的游戏使用Google WebRTC库来实现主要功能 - 音频/视频聊天。 我想推广我的玩家直接通过 Android 手机将屏幕投射流式传输到 YouTube 和 Twitch。我测试了一些应用程序,发现 Streamlabs 非常适合我的目的。
我的玩家可以观看比赛并使用 Streamlabs 应用程序将应用程序屏幕和声音流式传输到 Twitch/YouTube。
Streamlabs 可以从 2 个通道中选取音频 - 内部通道和麦克风(您可以调整每个通道的音量)。所有环境游戏声音,如点击声、音乐等,都会进入内部,这很棒。来自其他参与者(玩家)的 WebRTC 声音通过我的应用程序(使用 Android
AudioManager
)路由到扬声器,然后他们通过手机的麦克风拾取。所以,这可行,但这并不是很好。
问题是主播应该始终保持麦克风打开,即使他什么也没说,因为来自远程玩家的 WebRTC 语音会走这条路线(WebRTC -> 免提电话 -> 麦克风 -> Streamlabs)。而他也一直处于安静的环境中。另外,音质明显下降。
有没有办法以某种方式路由 WebRTC 声音,以便 Streamlabs 将它们视为内部声音?
请注意,该问题对于 Android 上的所有 WebRTC/VOIP 通话/电话会议应用程序都很常见。这可以通过 WhatsApp 通话、Facebook Messenger 通话或任何类似的应用程序轻松重现。您还可以使用 YouTube 或 Twitch 应用程序代替 Streamlabs,并获得类似的结果。
我尝试了 Android
AudioManager
的不同设置(使用 USAGE_MEDIA
而不是 USAGE_VOICE_COMMUNICATION
,将音频模式设置为 NORMAL
而不是 MODE_IN_COMMUNICATION
等等),但它们都不起作用。我想这是因为流媒体应用程序(Streamlabs 等)甚至在达到 AudioManager
之前就捕获了内部声音,可能在 Android MediaPlayer
级别上。
如果我可以路由远程 WebRTC 参与者的语音,让 Streamlabs 将其作为内部声音拾取,那就太好了,这样就不需要从扬声器到麦克风进行空中传输,从而降低质量并与环境声音混合.
如果需要,我可以更改 Google WebRTC(无论如何我自己构建它)。
要将 WebRTC 音频路由为 Streamlabs 等应用程序的内部音频,请尝试以下步骤:
1。修改WebRTC音频属性: 将WebRTC的
USAGE_MEDIA
中的音频播放流设置为CONTENT_TYPE_MUSIC
和AudioTrack
:
AudioAttributes playbackAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
2。使用 AudioManager 进行路由: 使用以下方式将音频路由到内部扬声器:
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);
3.杠杆
AudioPlaybackCapture
(Android 10+):
将 MediaProjection
与 AudioPlaybackCaptureConfiguration
一起使用可直接捕获应用程序播放。
4。自定义 OpenSL ES 音频路径: 使用 OpenSL ES 实现直接音频路由以实现更多控制。
如果这些失败,建议用户降低 Streamlabs 中的麦克风增益,以尽量减少使用时的质量问题
Speakerphone -> Mic