簡體   English   中英

webrtc音頻設備斷開連接並重新連接

[英]webrtc audio device disconnection and reconnection

我有一個基於WebRTC的視頻通話應用程序。 它按預期工作。 但是,在通話進行時,如果我斷開連接並重新連接音頻設備(麥克風+揚聲器),則只有揚聲器部分正在工作。 麥克風部分似乎無法正常工作-對方聽不到聲音。

音頻設備重新連接后,是否可以通知WebRTC重新進行音頻輸入?

音頻設備重新連接后,是否可以通知WebRTC重新進行音頻輸入?

您的問題看起來很簡單-揚聲器的對稱性很誘人-但是一旦我們與擁有多個攝像頭和麥克風的用戶打交道,事情就不那么簡單了:如果您的用戶斷開了他們所使用的藍牙耳機的連接,您是否應該等待他們重新連接還是立即切換到筆記本電腦的麥克風? 如果是后者,如果他們稍后重新連接,您是否會切換回去? 這些是應用程序決策。

處理這些事情的API是:主要是devicechange事件,以及replaceTrack()方法。 您可能還需要deviceId約束和enumerateDevices()方法來處理多個設備。

但是,為了簡單起見,讓我們以問題的假設為准,以探索API:

當用戶在通話中拔出唯一的麥克風(而不是攝像頭)時,我們的工作是在重新插入麥克風時恢復與它的對話,而不會丟失視頻:

  1. 首先,我們收聽ended事件以了解本地音軌何時下降。
  2. 發生這種情況時,我們會監聽devicechange事件以檢測是否重新插入。
  3. 發生這種情況時,我們可以使用enumerateDevices()檢查更改了什么,或者只是再次嘗試getUserMedia (僅這次是麥克風)。
  4. 如果成功,請使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM