video标签自动播放音视频并绘制波形图

news/2024/7/19 16:43:34 标签: 音视频, html, js, 波形图, video

html中的<video>标签可以用来播放常见的html" title=音视频>音视频格式,支持的格式包括:MP3、Ogg、WAV、AAC、MP4、WebM、AVI等,当然支持的格式也和浏览器和操作系统有关。这里以一个可以自动播放html" title=音视频>音视频并绘制波形图的页面为例说明一下<video>标签的用法。

video标签想自动播放,需要设置三个可选属性分别是muted、autoplay、controls,muted负责让html" title=音视频>音视频播放静音,autoplay让html" title=音视频>音视频自动播放,controls属性负责显示对应的控制菜单。除了通过html页面设置标签属性之外我们还可以通过js脚本来设置对应的属性,设置方法如下所示:

html"><!DOCTYPE html>
<html>
<head>
  <title>播放html" 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>

浏览器为了防止页面自动播放音频干扰用户,不允许在用户没有进行交互操作的时候,网页自动以非静音的模式播放html" title=音视频>音视频。所以autoplay属性必须搭配muted属性一块使用。
如果想要绘制html" title=音视频>音视频播放过程中的音频波形图,我们需要拦截对应的音频上下文,分析绘制对应的音频数据。对应的实现如下所示:

html"><!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>

显示效果如下图所示:

在这里插入图片描述

如果想让播放器自动播放音频并放音,我们可以采用一些迂回策略,首先让播放器自动静音播放,然后设置一个定时器检测用户是否和页面发生了操作交互,如果产生了交互就播放音频并绘制波形图。(浏览器默认没有交互的时候不允许播放声音) 对应的实现如下所示:

html"><!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>

http://www.niftyadmin.cn/n/5009258.html

相关文章

C++项目实战——基于多设计模式下的同步异步日志系统-①-项目介绍

文章目录 专栏导读项目介绍开发环境核心技术环境搭建日志系统介绍1.为什么需要日志系统2.日志系统技术实现2.1同步写日志2.2异步写日志 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&a…

Python|OpenCV-色彩空间之RGB轨迹调试板(5)

前言 本文是该专栏的第5篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 通常情况下,在处理图像需求的时候,需要掌握多个色彩空间的知识点。现实中,我们肉眼可以看到多种颜色,色彩是人的眼睛对于不同频率的光线的不同感受,其既是客观存在的,也是主观感知的。…

仅做笔记用:Civitai 通过 API 下载模型

域名和 web 网站的域名一样 搜索模型&#xff1a;GET /api/v1/models 常用参数&#xff08;都是可选&#xff09;&#xff1a; tag标签query标题&#xff08;模糊查询&#xff09;page页数limit每页大小username作者用户名types模型类型 (Checkpoint, TextualInversion, Hyp…

AI 时代的向量数据库、关系型数据库与 Serverless 技术丨TiDB Hackathon 2023 随想

TiDB Hackathon 2023 刚刚结束&#xff0c;我仔细地审阅了所有的项目。 在并未强调项目必须使用人工智能&#xff08;AI&#xff09;相关技术的情况下&#xff0c;引人注目的项目几乎一致地都使用了 AI 来构建自己的应用。 大规模语言模型&#xff08;LLM&#xff09;的问世使得…

STM32 FreeRTOS 内存问题

1. STM32L151C8T6 内存&#xff0c;64Kb 的Flash&#xff08;代码就是烧录在这里面的&#xff09;&#xff0c;16Kb 的RAM&#xff0c;程序跑起来之后的内存&#xff0c;相当于我们高考时发的草稿纸&#xff0c;直接影响程序的运行速度&#xff0c;可以用STM32 CubeMx 软件直接…

【数据仓库基础(二)】数据仓库架构

文章目录 一. 基本架构二. 主要数据仓库架构1. 数据集市架构1.1. 独立数据集市1.2. 从属数据集市1.3. Inmon企业信息工厂架构 2. Kimball数据仓库架构3. 混合型数据仓库架构 三. 操作数据存储&#xff08;ODS&#xff09; 一. 基本架构 架构是指系统的一个或多个结构。结构中包…

ARM/X86工业级数据采集 (DAQ) 与控制产品解决方案

I/O设备&#xff0c;包括信号调理模块、嵌入式PCI/PCIE卡、便携式USB模块、DAQ嵌入式计算机、模块化DAQ系统&#xff0c;以及DAQNavi/SDK软件开发包和DAQNavi/MCM设备状态监测软件。 工业I/O产品适用于各种工业自动化应用&#xff0c;从机器自动化控制、测试测量到设备状态监测…

SpringBoot+MySQL+Vue前后端分离的宠物领养救助管理系统(附论文)

文章目录 项目介绍主要功能截图:后台:登录个人中心宠物用品管理宠物领养管理用户管理用户领养管理宠物挂失管理论坛管理系统管理订单管理前台首页宠物挂失论坛信息宠物资讯部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创