Разделение аудиопотоков WebRTC и вывод их в разные каналы моего выходного аудиоустройства

#audio #webrtc

#Аудио #webrtc

Вопрос:

У меня есть простое приложение для группового чата WebRTC (аудио), основанное на коде в этом репозитории, между несколькими ноутбуками в локальной сети в разных комнатах. На каждом из ноутбуков, подключенных к чату, код автоматически смешивает все остальные аудиопотоки (все за вычетом захваченного потока этого ноутбука, т. Е. Обычный режим работы аудиочата).

На одном из ноутбуков, подключенных к чату (назовем его laptop0 так), я хотел бы иметь возможность выводить различные принятые потоки (в моем случае 3, поскольку всего подключено 4 ноутбука) на столько разных каналов устройства вывода, выбранных через WebRTC, т. Е. Аудио из

  1. laptop1 на выходной канал 1
  2. laptop2 на выходной канал 2
  3. laptop3 на выходной канал 3

Идея в том, что я подключу вывод, чтобы передать его в DAW, чтобы добавить некоторые эффекты к разным каналам.

Предполагая, что у меня есть выходное аудиоустройство с достаточным количеством каналов, есть ли простой способ сделать это? Фрагмент кода, который, как я предполагаю, находится в регионе, где это может быть реализовано (согласно моему крайне плохому пониманию WebRTC), выглядит следующим образом.

 var peer_connection = new RTCPeerConnection(
    {"iceServers": ICE_SERVERS},
    {"optional": [{"DtlsSrtpKeyAgreement": true}]} 
);
peers[peer_id] = peer_connection;

peer_connection.onicecandidate = function(event) {
    if (event.candidate) {
        signaling_socket.emit('relayICECandidate', {
            'peer_id': peer_id, 
            'ice_candidate': {
                'sdpMLineIndex': event.candidate.sdpMLineIndex,
                'candidate': event.candidate.candidate
            }
        });
    }
}
peer_connection.onaddstream = function(event) {
    console.log("onAddStream", event);
    var remote_media = USE_VIDEO ? $("<video>") : $("<audio>");
    remote_media.attr("autoplay", "autoplay");
    // remote_media.attr('webkit-playsinline', '');
    if (MUTE_AUDIO_BY_DEFAULT) {
    remote_media.attr("muted", "true");
    }
    remote_media.attr("controls", "");
    peer_media_elements[peer_id] = remote_media;
    $('body').append(remote_media);
    attachMediaStream(remote_media[0], event.stream);
}


/* Add our local stream */
peer_connection.addStream(local_media_stream);