JS实现Video标签自动播放与音频波形图绘制

作者:小圆点

时间:2026-10-30

浏览:125

本文详解HTML5 Video标签的自动播放机制及音频波形图绘制方法。针对浏览器自动播放限制,介绍通过muted属性配合交互检测实现非静音播放的迂回策略,并结合Web Audio API与Canvas技术实时解析音频数据,展示如何绘制动态音频波形。

文章目录

Video标签基础与自动播放配置

HTML中的<video>标签能够播放多种常见的音视频格式,包括MP3、Ogg、WAV、AAC、MP4、WebM以及AVI等。不过,具体支持的格式还取决于浏览器和操作系统的环境。本文将以一个能够自动播放音视频并绘制波形图的页面为例,详细介绍<video>标签的实际用法。

要使video标签实现自动播放,需配置三个关键属性:muted、autoplay和controls。其中,muted用于将音视频静音,autoplay负责触发自动播放,而controls则用于显示播放控制菜单。除了直接在HTML页面中设置这些属性外,还可以通过JavaScript脚本动态配置,具体设置方式如下所示:

<!DOCTYPE html>
<html>
<head>
  <title>播放音视频</title>
  <meta charset="UTF-8">
</head>
<body>
  <video id="myVideo" autoplay muted controls>
    <source src="./mysong.mp3" type="audio/mpeg">
    <!--source src="video.mp4" type="video/mp4"-->
    Your browser does not support the video tag.
  </video>
  <script>
	var videoElement = document.getElementById('myVideo');
	// 自动静音播放
	videoElement.muted = true; 
	videoElement.autoplay = true;
	videoElement.controls = true;
  </script>
</body>
</html>

出于防止页面自动播放音频干扰用户的考虑,浏览器规定在用户未进行交互操作前,网页不得以非静音模式自动播放音视频。因此,autoplay属性必须与muted属性配合使用。若需在音视频播放过程中绘制音频波形图,则需要拦截音频上下文,分析并绘制相应的音频数据。具体实现代码如下:

音频上下文与波形图绘制实现

<!DOCTYPE html>
<html>
<head>
  <title>绘制音频波形图</title>
  <meta charset="UTF-8">
</head>
<body>
  <h1>绘制音频波形图</h1>
  <video id="myVideo" controls>
    <source src="./mysong.mp3" type="audio/mpeg">
    Your browser does not support the video tag.
  </video>
  <canvas id="waveformCanvas"></canvas>
<script>
  // 获取video元素和canvas元素
  let video,analyser,ctx,canvas,audioContext,timerID,analyserNode;
  video = document.getElementById('myVideo');
  //播放的时候调用初始化操作
  video.addEventListener("play",initWaveDraw);
  //获取画布元素
  canvas = document.getElementById('waveformCanvas');
  ctx = canvas.getContext('2d');
  function initWaveDraw(){
	  // 创建音频上下文
	  if(!audioContext)
	  {
		  audioContext = new(window.AudioContext || window.webkitAudioContext)();
		  analyser = audioContext.createAnalyser();
		  analyser.connect(audioContext.destination);
		  analyserNode = audioContext.createMediaElementSource(video);
		  analyserNode.connect(analyser);
		  timerID = setInterval(drawWaveform,200); 
	  }
  }
  // 绘制波形图
  function drawWaveform() {
    // 获取波形数据
    var bufferLength = analyser.fftSize;
	console.log("drawing wave");
    var dataArray = new Uint8Array(bufferLength);
    analyser.getByteTimeDomainData(dataArray);
    // 清空画布
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    // 绘制波形图
    ctx.lineWidth = 2;
    ctx.strokeStyle = 'rgb(0, 255, 255)';
    ctx.beginPath();
    var sliceWidth = canvas.width * 1.0 / bufferLength;
    var x = 0;
    for (var i = 0; i < bufferLength; i++) {
      var v = dataArray[i] / 128.0;
      var y = v * canvas.height / 2;
      if (i === 0) {
        ctx.moveTo(x, y);
      } else {
        ctx.lineTo(x, y);
      }
      x += sliceWidth;
    }
    ctx.lineTo(canvas.width, canvas.height / 2);
    ctx.stroke();
  }
</script>	
</body>
</html>

最终显示效果如下图所示:

Video标签基础与自动播放配置

若希望播放器在自动播放音频的同时发出声音,可采用一种迂回策略:首先让播放器以静音模式自动播放,随后设置定时器检测用户是否与页面发生交互。一旦检测到交互行为,便开启音频播放并绘制波形图(因浏览器默认禁止无交互时的声音播放)。具体实现代码如下:

非静音自动播放的迂回策略

<!DOCTYPE html>
<html>
<head>
  <title>绘制音频波形图</title>
  <meta charset="UTF-8">
</head>
<body>
  <h1>绘制音频波形图</h1>
  <video id="myVideo" controls>
    <source src="./mysong.mp3" type="audio/mpeg">
    Your browser does not support the video tag.
  </video>
  <canvas id="waveformCanvas"></canvas>
<script>
  // 获取video元素和canvas元素
  let video,analyser,ctx,canvas,audioContext,timerID, checktimerID, analyserNode;
  var hasUserInteracted = false;
  video = document.getElementById('myVideo');
  //获取画布元素
  canvas = document.getElementById('waveformCanvas');
  ctx = canvas.getContext('2d');
  video.muted = true; 
  video.autoplay = true;
  video.controls = true;
  // 监听键盘按下事件
  function handleUserInteraction(){
    console.log("user has interacted");
	hasUserInteracted = true;
  }
  document.addEventListener('click', handleUserInteraction);
  checktimerID = setInterval(checkMouseClick, 1000);
  setTimeout(function(){ video.addEventListener("volumechange",handleUserInteraction);},2000);
  //定时检测鼠标事件,开启带声音的播放
	function checkMouseClick(){
		if(hasUserInteracted)
		{			
		   initWaveDraw();
		   video.muted = false; 
		   video.play();				
		   clearInterval(checktimerID);
		}
	}
  function initWaveDraw(){
	  // 创建音频上下文
	  if(!audioContext)
	  {
		  audioContext = new(window.AudioContext || window.webkitAudioContext)();
		  analyser = audioContext.createAnalyser();
		  analyser.connect(audioContext.destination);
		  analyserNode = audioContext.createMediaElementSource(video);
		  analyserNode.connect(analyser);
		  timerID = setInterval(drawWaveform,200); 
	  }
  }
  // 绘制波形图
  function drawWaveform() {
    // 获取波形数据
    var bufferLength = analyser.fftSize;
	console.log("drawing wave");
    var dataArray = new Uint8Array(bufferLength);
    analyser.getByteTimeDomainData(dataArray);
    // 清空画布
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    // 绘制波形图
    ctx.lineWidth = 2;
    ctx.strokeStyle = 'rgb(0, 255, 255)';
    ctx.beginPath();
    var sliceWidth = canvas.width * 1.0 / bufferLength;
    var x = 0;
    for (var i = 0; i < bufferLength; i++) {
      var v = dataArray[i] / 128.0;
      var y = v * canvas.height / 2;
      if (i === 0) {
        ctx.moveTo(x, y);
      } else {
        ctx.lineTo(x, y);
      }
      x += sliceWidth;
    }
    ctx.lineTo(canvas.width, canvas.height / 2);
    ctx.stroke();
  }
</script>	
</body>
</html>

至此,关于JS中video标签自动播放音视频并绘制波形图的讲解已完成。如需了解更多相关video标签自动播放音视频的内容,建议搜索本站往期文章或继续浏览后续相关文章,感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章