You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML5 Canvas添加音频后导出视频无声音问题求助

问题根因

你当前的代码仅把canvas捕获的视频流传入了MediaRecorder进行录制,单独实例化播放的音频没有被加入到待录制的媒体流中,因此导出的视频只有画面没有声音。

修复步骤
  • 从音频实例中提取音频轨道
  • 将音频轨道添加到canvas生成的视频流内
  • 用合并了音视频轨道的流初始化MediaRecorder
修复后代码

JS代码

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

var colors = ["pink","brown"];
function draw (){
    ctx.fillStyle = colors[Math.floor(Math.random() * colors.length)];
    ctx.fillRect(0, 0, canvas.width, canvas.height);
}
draw();
// 初始化音频,替换下方地址为你自己的音频资源地址即可
var audio = new Audio("替换为你的音频资源地址");
audio.play();

// 捕获canvas视频流
var videoStream = canvas.captureStream(30);
// 提取音频轨道添加到视频流中
var audioStream = audio.captureStream();
videoStream.addTrack(audioStream.getAudioTracks()[0]);

// 用合并音视频轨道后的流初始化录制器
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);
  video.src = videoURL;
};

mediaRecorder.start();
setInterval(draw, 300);
setTimeout(function (){ mediaRecorder.stop(); }, 5000);

HTML代码

<canvas width="300" height="300"></canvas>
<video autoplay controls></video>
注意事项
  • 音频资源需要满足跨域要求,否则无法正常捕获音频轨道
  • 多数浏览器会自动拦截非用户交互触发的音频播放、媒体录制行为,建议将音频播放和录制启动逻辑绑定到用户点击等交互事件上,避免功能被拦截

内容的提问来源于stack exchange,提问作者user2828442

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:45:04