setSinkId改变多个音频输出

时间:2018-01-18 09:37:13

标签: webrtc web-audio

这是问题,

首先,我列举了我在select元素中可用的所有设备:

navigator.mediaDevices.enumerateDevices()

当我更改一个输出时,它会在我选择的设备中发声。

HTMLMediaElement.setSinkId(deviceId)

如果我播放另一个音频并更改设备输出(setSinkId)后,它也会将第一个音频更改为最后一个deviceId。所以我在同一台设备上都有这两种声音。

我是否需要使用最后一个adapter.js版本来正确实现该问题?

********* EDITED **********

按照上述评论,它会尝试网络音频,但不会成功。有了getUserMedia,一切都很好。

navigator.getUserMedia( { audio: true, video: false },
    function (mediaStream) {
        // Create an audio context for the audio
        var ac = new (window.AudioContext || window.webKitAudioContext)();
        // Create a clone of the stream, if not the id of all the stream is default
        //var streamClone = stream.clone();
        var ss = ac.createMediaStreamSource(mediaStream);
        // Create a destination
        var sd = ac.createMediaStreamDestination()
        ss.connect(sd);
        element.srcObject = sd.stream;
        // Play the sound
        element.play();
        element.setSinkId(deviceId).then(function() {
            console.log('Set deviceId('+deviceId+') in the selected audio element');
        });
    },
    function (error) {
        console.log(error);
    }
);

但是使用我的远程流,我无法得到任何噪音

var ac = new (window.AudioContext || window.webKitAudioContext)();
// Create a clone of the stream, if not the id of all the stream is default
var streamClone = stream.clone();
var ss = ac.createMediaStreamSource(stream);
// Create a destination
var sd = ac.createMediaStreamDestination()
ss.connect(sd);
// Element is my HTMLMediaElement
element.srcObject = sd.stream;
// Play the sound
element.play();
element.setSinkId(deviceId).then(function() {
   console.log('Set deviceId('+deviceId+') in the selected audio element');
});

1 个答案:

答案 0 :(得分:0)

这很可能是由Chrome呈现音频的方式引起的。有关说明,建议使用webaudio解决问题,请参阅here

adapter.js无法修复此问题。