Как использовать JavaScript для воспроизведения аудиопотока, используя свойство srcObject объекта Audio? - PullRequest
0 голосов
/ 10 февраля 2020

Значение c таково: я использую java для чтения аудиофайла на внутреннем интерфейсе, а затем передаю его во внешний интерфейс веб-страницы через веб-сокет. На веб-странице я хочу воспроизвести данные, полученные веб-сокетом через объект Audio (). Я знаю, что знаю свойство SrcObject, используемое для конкретного c воспроизведения, но я не знаю, как его реализовать?

Ниже приведен код моей веб-страницы:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="send()">play</button>
</body>
</html>

<script>
    var websocket = null;

    //whether support or not WebSocket
    if ('WebSocket' in window) {
        websocket = new WebSocket("ws://localhost:8080/ws");
        websocket.binaryType = "arraybuffer";
    }
    else {
        alert('The current browser does not support websocket');
    }

    function send() {
        websocket.send("play");
    }
    //
    websocket.onmessage = function (event) {
        var data = event.data;
        // console.log(new Float32Array(data));
        // play(data);
    };


    websocket.onopen = function () {
        console.log("onopen...");
    };

    websocket.onclose = function () {
        console.log("onclose...");
    };

    websocket.onerror = function () {
        console.log("onerror...");
    };

    window.onbeforeunload = function () {
        closeWebSocket();
    };

    function closeWebSocket() {
        websocket.close();
    }

    var context;
    var audio = new Audio();
    var promise;
    var flag = false;
    var b = false;
    var scriptProcessorNode;
    var gainNode;
    var streamAudioDestinationNode;
    // data: arrayBuffer
    function play(data) {
        if (context === undefined) {
            context = new AudioContext();
        }

        var buffer = context.createBuffer(2, 48000 * 2, 48000);
        buffer.copyToChannel(new Float32Array(data), 1, 1);
        var bufferSourceNode = context.createBufferSource();
        bufferSourceNode.buffer = buffer;

        if (!b) {
            scriptProcessorNode = context.createScriptProcessor();
            gainNode = context.createGain();
            streamAudioDestinationNode = context.createMediaStreamDestination();
            b = true;
        }
        bufferSourceNode.connect(scriptProcessorNode);
        scriptProcessorNode.connect(gainNode);
        gainNode.connect(streamAudioDestinationNode);

        audio.srcObject = streamAudioDestinationNode.stream;
        // audio.load();
        if (!flag) {
            promise = audio.play();
            console.log("method play");
            flag = true;
        }
    }
</script>
...