如何在 iOS Safari 上使用 Daily.co 进行视频通话时录制麦克风
How to record mic WHILE video calling with Daily.co on iOS Safari
问题
通过我的 iPad 的 iOS Safari,我可以使用 Daily.co's video API to call other devices. But the moment I start recording my local microphone via the audio-recorder-polyfill library ,其他人将无法再听到我的声音,尽管我仍然可以听到他们的声音并分享我的照相机。即使录音会话结束,音频通话仍然中断(尽管录音机工作正常)。
这似乎 iOS 具体,因为我的 Surface Windows Chrome.
没有问题
如何重现
大约需要 2 分钟
- 使用 iPad Safari 和任何其他设备访问 explain.mit.edu。按绿色通话按钮。
- 确认视频通话正常后,按下 iPad
上的录制按钮
- 请注意,其他设备无法再听到任何声音
我试过的
首先,我猜测 MediaRecorder 会使 Daily 视频通话对麦克风的访问无效,所以我使用 setLocalDevice
每 5 秒重新指定对 Daily 的访问,看看会发生什么。录音的时候没啥区别,但是录音结束的时候确实恢复了语音通话。
所以剩下的问题是音频呼叫流在录制过程中不起作用:我阅读了关于 MediaCapture API 的 MDN 文档,它提到一个流有一个输入和一个输出,但我不知道这到底是什么意思,也不知道一个麦克风流是否可以同时被两个“东西”访问。
相关代码
我只使用 Daily 和 audio-recorder-polyfill 提供的基本最低 API
视频通话(full code here)
await this.CallObject.join({
url: conferenceRoom.url,
userName: this.sessionID
});
录音(full code here)
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
this.recorder = new MediaRecorder(stream);
this.recorder.start();
我不认为问题是由其他地方引起的,但 here's the full repository code 如果需要的话
真实环境
对于上下文,我在 https://explain.mit.edu 上工作。你去那里寻求帮助,然后其他人会到达并使用实时黑板和语音聊天向你解释一些事情 - 并且 KhanAcademy 视频作为副产品制作。但是现在如果有人按下“录音”,语音聊天就会停止。
我们可以为此处理一个重现案例,但我猜是怎么回事。 iOS Safari 过去会在调用 getUserMedia()
时停止来自本地 mic/cam 的任何当前曲目。因此,与桌面浏览器和 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();
问题
通过我的 iPad 的 iOS Safari,我可以使用 Daily.co's video API to call other devices. But the moment I start recording my local microphone via the audio-recorder-polyfill library ,其他人将无法再听到我的声音,尽管我仍然可以听到他们的声音并分享我的照相机。即使录音会话结束,音频通话仍然中断(尽管录音机工作正常)。
这似乎 iOS 具体,因为我的 Surface Windows Chrome.
没有问题如何重现
大约需要 2 分钟
- 使用 iPad Safari 和任何其他设备访问 explain.mit.edu。按绿色通话按钮。
- 确认视频通话正常后,按下 iPad 上的录制按钮
- 请注意,其他设备无法再听到任何声音
我试过的
首先,我猜测 MediaRecorder 会使 Daily 视频通话对麦克风的访问无效,所以我使用 setLocalDevice
每 5 秒重新指定对 Daily 的访问,看看会发生什么。录音的时候没啥区别,但是录音结束的时候确实恢复了语音通话。
所以剩下的问题是音频呼叫流在录制过程中不起作用:我阅读了关于 MediaCapture API 的 MDN 文档,它提到一个流有一个输入和一个输出,但我不知道这到底是什么意思,也不知道一个麦克风流是否可以同时被两个“东西”访问。
相关代码
我只使用 Daily 和 audio-recorder-polyfill 提供的基本最低 API
视频通话(full code here)
await this.CallObject.join({
url: conferenceRoom.url,
userName: this.sessionID
});
录音(full code here)
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
this.recorder = new MediaRecorder(stream);
this.recorder.start();
我不认为问题是由其他地方引起的,但 here's the full repository code 如果需要的话
真实环境 对于上下文,我在 https://explain.mit.edu 上工作。你去那里寻求帮助,然后其他人会到达并使用实时黑板和语音聊天向你解释一些事情 - 并且 KhanAcademy 视频作为副产品制作。但是现在如果有人按下“录音”,语音聊天就会停止。
我们可以为此处理一个重现案例,但我猜是怎么回事。 iOS Safari 过去会在调用 getUserMedia()
时停止来自本地 mic/cam 的任何当前曲目。因此,与桌面浏览器和 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();