Как получить медиапоток с выхода динамика, чтобы передать его по сети или записать? - PullRequest
3 голосов
/ 31 октября 2019

Я пытаюсь получить выход динамика, а затем делаю все, что захочу, с этим потоком.

Я пытался использовать это для получения потока говорящего:

var mySpeakerStream = new MediaStream();
navigator.mediaDevices.getUserMedia({audio: {deviceId : {exact: mySpeakerId} } }).then(s => {        
        myStream.addTrack(s.getAudioTracks()[0]);
}).catch( console.log('failed') );

Я ожидал получить динамик, но я не получил, и затем я понял, что метод getUserMedia возвращает MediaStream только устройства ввода. Есть ли способ получить поток вывода спикера?

Ответы [ 2 ]

3 голосов
/ 31 октября 2019

Мультимедийные устройства JavaScript работают точно так же, как и системные аудиоустройства. Если вы сможете записать устройство в чем-то вроде Audacity (или в любом диктофоне), вы сможете записать устройство в JavaScript, используя медиаустройство.

Однако для получения доступа к выходу динамика требуется установитьв операционной системе компьютера - возможно, в целях безопасности, среди других причин.

Это можно сделать, создав в операционной системе устройство звуковой обратной связи , но создание обратной петли может 'по состоянию на октябрь 2019 года не может быть сделано исключительно через клиентский JavaScript.

0 голосов
/ 31 октября 2019

после долгих размышлений о проблеме я обнаружил, что: я могу использовать метод getDisplyMedia, но он не поддерживает только аудио запросы, поэтому я попытался получить поток как аудио, так и видео, а затем вытащить звуковые дорожки изэто просто так:

var speaker = new MediaStream;
if (navigator.getDisplayMedia) {
    navigator.getDisplayMedia({
        video: true ,
        audio: true
    }).then(stream => {
        speaker.addTrack(stream.getAudioTracks()[0].clone());
        // stopping and removing the video track to enhance the performance
        stream.getVideoTracks()[0].stop();
        stream.removeTrack(stream.getVideoTracks()[0]);
    }).catch(() => {
        console.error('failed')
    });
} else if (navigator.mediaDevices.getDisplayMedia) {
    navigator.mediaDevices.getDisplayMedia({
        video: true ,
        audio: true
    }).then(stream => {
        speaker.addTrack(stream.getAudioTracks()[0].clone());
        // stopping and removing the video track to enhance the performance
        stream.getVideoTracks()[0].stop();
        stream.removeTrack(stream.getVideoTracks()[0]);
    }).catch(() => {
        console.error('failed')
    });
}

Я знаю, что это не решает проблему идеально, но я думаю, что это полезно.

'все еще работает и ждет новых решений'

...