MediaRecorderAPI:如何使用来自画布的captureStream和来自音频文件的音频源来产生媒体流

问题描述 投票:1回答:1

目前,我可以从画布上获取视频。但是我需要合并音频流。我到处搜索只是意识到我需要以某种方式利用AudoDestinationNode对象。我尝试了一种或两种方法来做到这一点。但最终一无所获。这是仅使我得到视频的片段!现在我需要音频合并部分。

    var canvas = document.querySelector("canvas");
    var ctx = canvas.getContext("2d");
      
        function download(content) {
            element.click();
            document.body.removeChild(element);
        }

        function roll(){

            var colors = ["red", "blue", "yellow", "orange", "black", "white", "green"];
            function draw (){
                ctx.fillStyle = colors[Math.floor(Math.random() * colors.length)];
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            }
            draw();

            var videoStream = canvas.captureStream(30);

            var mediaRecorder = new MediaRecorder(videoStream);

            var chunks = [];
            mediaRecorder.ondataavailable = function(e) {
            chunks.push(e.data);
            };

            mediaRecorder.onstop = function(e) {
            var blob = new Blob(chunks, { 'type' : 'video/mp4' });
            chunks = [];
            var videoURL = URL.createObjectURL(blob);
            var tag = document.createElement('a');
            tag.href = videoURL;
            tag.download = 'sample.mp4';
            document.body.appendChild(tag);
            tag.click();
            document.body.removeChild(tag);
            };
            mediaRecorder.ondataavailable = function(e) {
            chunks.push(e.data);
            };

            mediaRecorder.start();
            setInterval(draw, 300);
            setTimeout(function (){ mediaRecorder.stop(); }, 5000);
        }
<html>
<canvas width="300" height="300"></canvas>
<button onclick="roll()">Get</button>
</html>
javascript web-audio-api web-mediarecorder
1个回答
0
投票

我希望这会有所帮助。请记住,音频源不得引发CORS错误。

    var canvas = document.querySelector("canvas");
    var ctx = canvas.getContext("2d");

        function roll(){

            var colors = ["red", "blue", "yellow", "orange", "black", "white", "green"];
            function draw (){
              ctx.fillStyle = colors[Math.floor(Math.random() * colors.length)];
              ctx.fillRect(0, 0, canvas.width, canvas.height);
            }
            draw();

            var videoStream = canvas.captureStream(30);

            //create a dynamic audio tag
            var sound      = document.createElement('audio');
            sound.controls = 'controls';
            sound.src      = 'demo.mp3';
            sound.type     = 'audio/mpeg';
            sound.play();

            //create an audioContext followed by an AudioDestinationNode object
            var ac = new AudioContext();
            var mediaStreamDestination = new MediaStreamAudioDestinationNode(ac);
            var mediaElementSource = new MediaElementAudioSourceNode(ac, { mediaElement: sound });
            mediaElementSource.connect(mediaStreamDestination);
            //at this step, you have the Audiostream ready

            //get the audio and video MediaStreamTrack objects
            var videoTrack = videoStream.getVideoTracks()[0];
            var audioTrack = mediaStreamDestination.stream.getAudioTracks()[0];

            //this will get the Mediastream object from the two MediaStreamTrack objects
            var finalStream = new MediaStream([audioTrack, videoTrack])

            var mediaRecorder = new MediaRecorder(finalStream);

            var chunks = [];
            mediaRecorder.ondataavailable = function(e) {
            chunks.push(e.data);
            };

            mediaRecorder.onstop = function(e) {
            var blob = new Blob(chunks, { 'type' : 'video/mp4' });
            chunks = [];
            var videoURL = URL.createObjectURL(blob);
            var tag = document.createElement('a');
            tag.href = videoURL;
            tag.download = 'sample.mp4';
            document.body.appendChild(tag);
            tag.click();
            document.body.removeChild(tag);
            };
            mediaRecorder.ondataavailable = function(e) {
            chunks.push(e.data);
            };

            mediaRecorder.start();
            setInterval(draw, 300);
            setTimeout(function (){ mediaRecorder.stop(); }, 5000);
        }
<html>
<canvas width="300" height="300"></canvas>
<button onclick="roll()">Get</button>
</html>
© www.soinside.com 2019 - 2024. All rights reserved.