最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript+Canvas實現(xiàn)繪制音頻可視化波形圖

 更新時間:2024年02月02日 15:51:47   作者:伍嘉源  
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript和Canvas實現(xiàn)繪制音頻可視化波形圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1. 效果演示

上圖演示了音頻的波形隨著音樂的節(jié)奏而跌宕起伏

2. 基本概念說明

2.1 音頻源節(jié)點

音頻數(shù)據(jù)的來源,是音頻處理的其中一個環(huán)節(jié)

2.2 時域圖

聲音信號是一維的時域信號,無法觀察出頻率隨時間的變化規(guī)律

橫軸代表時間, 縱軸是信號的變化(振幅)

2.3 頻譜圖

任何信號(當(dāng)然要滿足一定的數(shù)學(xué)條件),都可以通過傅立葉變換而分解成一個直流分量(也就是一個常數(shù))和若干個(一般是無窮多個)正弦信號的和

每個正弦分量都有自己的頻率和幅值,頻率值作橫軸,幅值作縱軸

3. 案例代碼

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Canvas在音頻可視化的應(yīng)用</title>
  </head>
  <body>
    <canvas></canvas>
    <audio src="./1.mp3" controls></audio>
    <script>
      const audio = document.querySelector('audio')
      const canvas = document.querySelector('canvas')
      const con = canvas.getContext('2d')

      // 初始化canvas的尺寸
      canvas.width = window.innerWidth // 窗口的內(nèi)部寬度
      canvas.height = window.innerHeight / 2 //窗口的內(nèi)部高度
      document.body.style.backgroundColor = '#000000' // 背景顏色設(shè)置為黑色

	  // 定義數(shù)組和音頻分析器
      let dataArray, analyser
      audio.onplay = () => {
        // 初始化
        const audCon = new AudioContext() // 創(chuàng)建音頻上下文
        const source = audCon.createMediaElementSource(audio) // 創(chuàng)建音頻源節(jié)點
        // 創(chuàng)建音頻分析器
        analyser = audCon.createAnalyser()
        // 快速傅里葉變換的長度必須為2的整數(shù)冪
        analyser.fftSize = 512 // 這里把快速傅里葉變換的長度設(shè)置為512
        // 連接音頻源節(jié)點到音頻分析器上
        source.connect(analyser)
        // 連接音頻分析器到音頻終端上
        analyser.connect(audCon.destination)
        // 創(chuàng)建數(shù)組,用于接收分析器節(jié)點的分析數(shù)據(jù)
        // Uint8Array 數(shù)組類型表示一個 8 位無符號整型數(shù)組
        // frequencyBinCount是fftSize值的一半作為可視化音頻的數(shù)組長度
        dataArray = new Uint8Array(analyser.frequencyBinCount)
      }

      // 把分析出的波形繪制到canvas上
      (function draw() {
        // 動畫幀,按幀繪制canvas
        requestAnimationFrame(draw)
        // 清空畫布
        const { width, height } = canvas
        con.clearRect(0, 0, width, height)
        // 讓分析器節(jié)點分析出數(shù)據(jù)到數(shù)組中
        analyser.getByteFrequencyData(dataArray)
        // 設(shè)置canvas上下文繪制的顏色
        con.fillStyle = 'skyblue'
        // len表示獲取分析到的音頻數(shù)據(jù)數(shù)組長度的
        // 這里除以2.5是剔除不經(jīng)常出現(xiàn)的高頻的部分
        const len = dataArray.length / 2.5
        // barWidth表示每個波形矩形的寬度
        // 這里除以2是為了繪制對稱的波形圖
        const barWidth = width / len / 2
        for (let i = 0; i < len; i++) {
		  // data是8位數(shù)組的每個數(shù)據(jù),因為是一個字節(jié),即data的值都是 <= 255
          const data = dataArray[i] 
          // barHeight表示每個波形矩形的高度,值為單位長度乘canvas容器的高
          const barHeight = (data / 255) * height
          // 繪制點y
          const y = height - barHeight
          // 繪制點x1
          const x1 = i * barWidth + width / 2
          // 繪制點x2
          const x2 = width / 2 - (i + 1) * barWidth
          // 繪制右半部分波形圖
          con.fillRect(x1, y, barWidth - 2, barHeight)
          // 繪制左半部分波形圖
          con.fillRect(x2, y, barWidth - 2, barHeight)
        }
      })()
    </script>
  </body>
</html>

到此這篇關(guān)于JavaScript+Canvas實現(xiàn)繪制音頻可視化波形圖的文章就介紹到這了,更多相關(guān)JavaScript Canvas音頻波形圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • javascript時間戳和日期字符串相互轉(zhuǎn)換代碼(超簡單)

    javascript時間戳和日期字符串相互轉(zhuǎn)換代碼(超簡單)

    下面小編就為大家?guī)硪黄猨avascript時間戳和日期字符串相互轉(zhuǎn)換代碼(超簡單)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • uniapp電商小程序?qū)崿F(xiàn)訂單30分鐘倒計時

    uniapp電商小程序?qū)崿F(xiàn)訂單30分鐘倒計時

    這篇文章主要為大家詳細(xì)介紹了uniapp電商小程序?qū)崿F(xiàn)訂單30分鐘倒計時,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • javascript筆記之匿名函數(shù)和閉包

    javascript筆記之匿名函數(shù)和閉包

    這篇文章主要為大家詳細(xì)介紹了javascript筆記之匿名函數(shù)和閉包的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • javascript操作表格

    javascript操作表格

    javascript操作表格...
    2006-07-07
  • tweenjs緩動算法的使用實例分析

    tweenjs緩動算法的使用實例分析

    這篇文章主要介紹了tweenjs緩動算法的使用,結(jié)合實例形式分析了Tween.js插件的原理與使用技巧,需要的朋友可以參考下
    2019-08-08
  • 詳解JavaScript是如何驗證URL的

    詳解JavaScript是如何驗證URL的

    當(dāng)開發(fā)者需要為不同目的以不同形式處理URL時,我們經(jīng)常會借助于JavaScript。本文就為大家整理了JavaScript驗證URL的方法,希望對大家有所幫助
    2023-02-02
  • js實現(xiàn)電梯導(dǎo)航效果的示例代碼

    js實現(xiàn)電梯導(dǎo)航效果的示例代碼

    這篇文章主要介紹了JavaScript實現(xiàn)電梯導(dǎo)航效果的相關(guān)知識,文中通過示例代碼介紹的很詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-12-12
  • 基于webpack 實用配置方法總結(jié)

    基于webpack 實用配置方法總結(jié)

    下面小編就為大家?guī)硪黄趙ebpack 實用配置方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 28個JavaScript常用字符串方法以及使用技巧總結(jié)

    28個JavaScript常用字符串方法以及使用技巧總結(jié)

    這篇文章主要給大家介紹了28個JavaScript常用字符串方法以及使用技巧的相關(guān)資料,文中統(tǒng)計的方法都非常實用,無論是日常工作還是面試,都建議多看一看,需要的朋友可以參考下
    2021-09-09
  • 移動端基礎(chǔ)事件總結(jié)與應(yīng)用

    移動端基礎(chǔ)事件總結(jié)與應(yīng)用

    本文主要介紹了移動端基礎(chǔ)事件總結(jié)與應(yīng)用,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01

最新評論

太仓市| 临安市| 唐海县| 岑巩县| 扎鲁特旗| 新沂市| 淮北市| 安阳市| 华容县| 得荣县| 上饶市| 博爱县| 晴隆县| 蓬莱市| 锡林郭勒盟| 连平县| 炎陵县| 漯河市| 柯坪县| 常宁市| 灵川县| 康保县| 晋州市| 大庆市| 无锡市| 文安县| 黄山市| 铜山县| 工布江达县| 扶余县| 漾濞| 保康县| 夹江县| 宁陵县| 龙南县| 临汾市| 紫阳县| 通化县| 汉寿县| 博乐市| 昌江|