[英]webrtc audio device disconnection and reconnection
我有一個基於WebRTC的視頻通話應用程序。 它按預期工作。 但是,在通話進行時,如果我斷開連接並重新連接音頻設備(麥克風+揚聲器),則只有揚聲器部分正在工作。 麥克風部分似乎無法正常工作-對方聽不到聲音。
音頻設備重新連接后,是否可以通知WebRTC重新進行音頻輸入?
音頻設備重新連接后,是否可以通知WebRTC重新進行音頻輸入?
您的問題看起來很簡單-揚聲器的對稱性很誘人-但是一旦我們與擁有多個攝像頭和麥克風的用戶打交道,事情就不那么簡單了:如果您的用戶斷開了他們所使用的藍牙耳機的連接,您是否應該等待他們重新連接還是立即切換到筆記本電腦的麥克風? 如果是后者,如果他們稍后重新連接,您是否會切換回去? 這些是應用程序決策。
處理這些事情的API是:主要是端和devicechange事件,以及replaceTrack()方法。 您可能還需要deviceId約束和enumerateDevices()方法來處理多個設備。
但是,為了簡單起見,讓我們以問題的假設為准,以探索API:
當用戶在通話中拔出唯一的麥克風(而不是攝像頭)時,我們的工作是在重新插入麥克風時恢復與它的對話,而不會丟失視頻:
ended
事件以了解本地音軌何時下降。 devicechange
事件以檢測是否重新插入。 await sender.replaceTrack(newAudioTrack)
發送我們的新音頻。 可能看起來像這樣:
let sender;
(async () => {
try {
const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true});
pc.addTrack(stream.getVideoTracks()[0], stream);
sender = pc.addTrack(stream.getAudioTracks()[0], stream);
sender.track.onended = () => navigator.mediaDevices.ondevicechange = tryAgain;
} catch (e) {
console.log(e);
}
})();
async function tryAgain() {
try {
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
await sender.replaceTrack(stream.getAudioTracks()[0]);
navigator.mediaDevices.ondevicechange = null;
sender.track.onended = () => navigator.mediaDevices.ondevicechange = tryAgain;
} catch (e) {
if (e.name == "NotFoundError") return;
console.log(e);
}
}
// Your usual WebRTC negotiation code goes here
以上僅供參考。 我敢肯定,有很多極端的情況要考慮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.