1

问题

使用 iPad 的 iOS Safari,我可以使用Daily.co 的视频 API调用其他设备。但是,当我开始通过audio-recorder-polyfill 库录制本地麦克风时,其他人将不再能够听到我的声音,即使我仍然可以听到他们的声音并共享我的相机。即使录音会话结束,音频通话仍然中断(尽管录音机工作正常)。

它似乎是特定于 iOS 的,因为我的 Surface 的 Windows Chrome 没有问题。

如何重现

大约需要2分钟

  1. 使用 iPad Safari 和任何其他设备访问explain.mit.edu 。按下绿色呼叫按钮。
  2. 确认视频通话正常后,按 iPad 上的录制按钮
  3. 请注意,其他设备无法再听到任何声音

我试过的

首先,我猜想 MediaRecorder 会使 Daily 视频通话对麦克风的访问无效,所以我曾经setLocalDevice每隔 5 秒重新指定对 Daily 的访问,看看会发生什么。在录制过程中没有任何区别,但是当录制结束时,它确实恢复了音频通话。

所以剩下的问题是音频调用流在录制过程中不起作用:我阅读了有关 MediaCapture API 的 MDN 文档,它提到一个流有一个输入和一个输出,但我不知道那是什么手段,以及是否可以由两个“事物”同时访问一个麦克风流。

相关代码

我只使用 Daily 和 audio-recorder-polyfill 提供的基本最小 API

视频通话(完整代码在这里

await this.CallObject.join({
  url: conferenceRoom.url,
  userName: this.sessionID
}); 

录音(完整代码在这里

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
this.recorder = new MediaRecorder(stream); 
this.recorder.start(); 

我不相信这个问题是在其他地方引起的,但如果需要,这里是完整的存储库代码

真实世界的上下文 对于上下文,我在https://explain.mit.edu上工作。你去那里寻求帮助,然后其他人会到达并使用实时黑板和语音聊天向你解释一些事情 - 并且作为副产品制作了 KhanAcademy 视频。但是现在如果有人按下“录音”,语音聊天将停止工作。

4

1 回答 1

5

我们可以为此制作一个重现案例,但我猜会发生什么。iOS Safari 过去在任何时候都会停止来自本地麦克风/摄像头的任何当前曲目getUserMedia()。因此,与桌面浏览器和 Android Chrome 不同,在 iOS 上您不能请求或使用多个流。

iOS Safari 是一个移动的目标,我最近没有关注这个特定的问题。但如果这是正在发生的事情,也许你可以通过一个相当小的代码更改来解决它。

代替:

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });

您可以从 Daily call 对象中获取本地音轨并从中制作流:

const track = this.callObject.participants().local.tracks.audio.persistentTrack
if (!track) {
  throw new Error("can't start recording right now ... no audio track");
}
this.recorder = new MediaRecorder(new MediaStream([track]));
this.recorder.start();
于 2021-07-02T19:48:19.517 回答