PizzicatoJS 播放到指定设备 (SinkId)

PizzicatoJS play to specified device (SinkId)

我一直在使用这个名为 Pizzicato 的库,我想知道如何将它播放到特定的音频输出设备。我以前用这样的网络音频 API 做过。

navigator.getUserMedia({audio: true}, function(stream) {
    var ac = new AudioContext();
    var audio = new Audio();
    var microphone = ac.createMediaStreamSource(stream);
    var dest = ac.createMediaStreamDestination();
    microphone.connect(dest);

    audio.srcObject = dest.stream;

    audio.setSinkId(settings.output);
    audio.play();
}, function (){console.warn("Error getting audio stream from getUserMedia")});

但在下面的示例中,它什么也没播放。我已经尝试删除 setSinkId,但它仍然不起作用。

var voice = new Pizzicato.Sound({ source: 'input' }, (err) => {
    var dest = voice.getRawSourceNode().context.createMediaStreamDestination();
    var audio = new Audio();
    voice.connect(dest);
    audio.srcObject = dest.stream;
    audio.setSinkId(id);
    audio.play();
});

Pizzicato.js 有一个 internal GainNode to which it connects everything. Luckily there is a getter 允许我们从外部修改那个 GainNode。

为了达到预期的结果,我们必须断开 GainNode 与它默认连接到的 AudioContext 的目的地的连接。之后我们可以将它连接到新创建的 MediaStreamAudioDestinationNode。

const voice = new Pizzicato.Sound({ source: 'input' });

// Disconnect the masterGainNode from the default destination.
Pizzicato.masterGainNode.disconnect(Pizzicato.context.destination);

const dest = Pizzicato.context.createMediaStreamDestination();

// Connect the masterGainNode to the new destination.
Pizzicato.masterGainNode.connect(dest);

const audio = new Audio();

audio.srcObject = dest.stream;
audio.setSinkId(id);
audio.play();