国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記錄--關(guān)于前端的音頻可視化-Web Audio

這篇具有很好參考價(jià)值的文章主要介紹了記錄--關(guān)于前端的音頻可視化-Web Audio。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

這里給大家分享我在網(wǎng)上總結(jié)出來的一些知識,希望對大家有所幫助

記錄--關(guān)于前端的音頻可視化-Web Audio

背景

最近聽音樂的時(shí)候,看到各種動效,突然好奇這些音頻數(shù)據(jù)是如何獲取并展示出來的,于是花了幾天功夫去研究相關(guān)的內(nèi)容,這里只是給大家一些代碼實(shí)例,具體要看懂、看明白,還是建議大家大家結(jié)合相關(guān)API文檔來閱讀這篇文章。

參考資料地址:Web Audio API - Web API 接口參考 | MDN (mozilla.org)

記錄--關(guān)于前端的音頻可視化-Web Audio

實(shí)現(xiàn)思路

首先畫肯定是用canvas去畫,關(guān)于音頻的相關(guān)數(shù)據(jù)(如頻率、波形)如何去獲取,需要去獲取相關(guān)audio的DOM 或通過請求處理去拿到相關(guān)的音頻數(shù)據(jù),然后通過Web Audio API 提供相關(guān)的方法來實(shí)現(xiàn)。(當(dāng)然還要考慮要音頻請求跨域的問題,留在最后。)

一個(gè)簡單而典型的 web audio 流程如下(取自MDN):

  1. 創(chuàng)建音頻上下文
  2. 在音頻上下文里創(chuàng)建源 — 例如?<audio>, 振蕩器,流
  3. 創(chuàng)建效果節(jié)點(diǎn),例如混響、雙二階濾波器、平移、壓縮
  4. 為音頻選擇一個(gè)目的地,例如你的系統(tǒng)揚(yáng)聲器
  5. 連接源到效果器,對目的地進(jìn)行效果輸出

記錄--關(guān)于前端的音頻可視化-Web Audio

實(shí)現(xiàn)

一、頻率圖

實(shí)現(xiàn)第一種類型,首先我們需要通過fetch或xhr來獲取一個(gè)線上音頻的數(shù)據(jù),這里以fetch為例;

 //創(chuàng)建一個(gè)音頻上下文、考慮兼容性問題
 let audioCtx = new (window.AudioContext || window.webkitAudioContext)();
 //添加一個(gè)音頻源節(jié)點(diǎn)
 let source = audioCtx.createBufferSource();
//res.arrayBuffer是將數(shù)據(jù)轉(zhuǎn)換為arrayBuffer格式
 fetch(url).then((res) => res.arrayBuffer()).then((res) => {
        //decodeAudioData是將arrayBuffer格式數(shù)據(jù)轉(zhuǎn)換為audioBuffer
        audioCtx.decodeAudioData(res).then((buffer) => {
          // decodeAudioData解碼完成后,返回一個(gè)AudioBuffer對象
          // 繪制音頻波形圖
          draw(buffer);
          // 連接音頻源
          source.buffer = buffer;
          source.connect(audioCtx.destination);
          // 音頻數(shù)據(jù)處理完畢
        });
      });

記錄--關(guān)于前端的音頻可視化-Web Audio

?需要明白的是,source.connect(audioCtx.destination)是將音頻源節(jié)點(diǎn)鏈接到輸出設(shè)備,否則會沒聲音哦。那么現(xiàn)在有了數(shù)據(jù)、我們只需要通過canvas將數(shù)據(jù)畫出來即可。

function draw(buffer) {
  // buffer.numberOfChannels返回音頻的通道數(shù)量,1即為單聲道,2代表雙聲道。這里我們只取一條通道的數(shù)據(jù)
  let data = [];
  let originData = buffer.getChannelData(0);
  // 存儲所有的正數(shù)據(jù)
  let positives = [];
  // 存儲所有的負(fù)數(shù)據(jù)
  let negatives = [];
  // 先每隔50條數(shù)據(jù)取1條
  for (let i = 0; i < originData.length; i += 50) {
    data.push(originData[i]);
  }
  // 再從data中每10條取一個(gè)最大值一個(gè)最小值
  for (let j = 0, len = data.length / 10; j < len; j++) {
    let temp = data.slice(j * 10, (j + 1) * 10);
    positives.push(Math.max(...temp));
    negatives.push(Math.min(...temp));
  }
  if (canvas.getContext) {
    let ctx = canvas.getContext("2d");
    canvas.width = positives.length;
    let x = 0;
    let y = 75;
    let offset = 0;
    var grd = ctx.createLinearGradient(0, 0, canvas.width, 0);
    // 為漸變添加顏色,參數(shù)1表示漸變開始和結(jié)束之間的位置(用0至1的占比表示),參數(shù)2位顏色
    grd.addColorStop(0, "yellow");
    grd.addColorStop(0.5, "red");
    grd.addColorStop(1, "blue");
    ctx.fillStyle = grd;
    ctx.beginPath();
    ctx.moveTo(x, y);
    // 橫坐標(biāo)上方繪制正數(shù)據(jù),下方繪制負(fù)數(shù)據(jù)
    // 先從左往右繪制正數(shù)據(jù)
    // x + 0.5是為了解決canvas 1像素線條模糊的問題
    for (let k = 0; k < positives.length; k++) {
      ctx.lineTo(x + k + 0.5, y - 50 * positives[k]);
    }

    // 再從右往左繪制負(fù)數(shù)據(jù)
    for (let l = negatives.length - 1; l >= 0; l--) {
      ctx.lineTo(x + l + 0.5, y + 50 * Math.abs(negatives[l]));
    }
    // 填充圖形
    ctx.fill();
  }
}

[參考文章](Web Audio - 繪制音頻圖譜 - 掘金 (juejin.cn))

二、實(shí)時(shí)頻率圖

實(shí)現(xiàn)第二種類型,獲取實(shí)時(shí)頻率,用到的API與第一種有區(qū)別,但流程一直,都是通過一個(gè)音頻源節(jié)點(diǎn)通過連接達(dá)到效果。只不過在連接的中間加入了一個(gè)分析器analyser,在將分析器連接到輸出設(shè)備。

    const audio =document.querySelector('audio')
    //解決音頻跨域問題
    audio.crossOrigin ='anonymous'
    const  canvas =document.querySelector('canvas')
    const ctx=canvas.getContext("2d")
        function initCanvas(){
        //初始化canvas
            canvas.width=window.innerWidth*devicePixelRatio
            canvas.height=(window.innerHeight/2)*devicePixelRatio
        }
        initCanvas()
        //將數(shù)據(jù)提出來
        let dataArray,analyser;
        //播放事件
        audio.onplay=function(){
            //創(chuàng)建一個(gè)音頻上下文實(shí)例
            const audioCtx=new (window.AudioContext || window.webkitAudioContext)();
            //添加一個(gè)音頻源節(jié)點(diǎn)
            const source=audioCtx.createMediaElementSource(audio);
            //分析器節(jié)點(diǎn)
             analyser=audioCtx.createAnalyser();
            //fft分析器  越大 分析越細(xì)
            analyser.fftSize=512
            //創(chuàng)建一個(gè)無符號字節(jié)的數(shù)組
             dataArray=new Uint8Array( analyser.frequencyBinCount);
            //音頻源節(jié)點(diǎn) 鏈接分析器
            source.connect(analyser)
            //分析器鏈接輸出設(shè)備
            analyser.connect(audioCtx.destination,)
        }
那么接下來至于怎么把數(shù)據(jù)畫出來,就憑大家的想法了。
            requestAnimationFrame(draw)
            //
            const {width ,height}=canvas;
            ctx.clearRect(0,0,width,height)
            //分析器節(jié)點(diǎn)分析出的數(shù)據(jù)到數(shù)組中
            ctx.fillStyle='#78C5F7'
           ctx.lineWidth = 2;
            ctx.beginPath();
            //getByteFrequencyData,分析當(dāng)前音頻源的數(shù)據(jù) 裝到dataArray數(shù)組中去
            //獲取實(shí)時(shí)數(shù)據(jù)
            analyser.getByteFrequencyData(dataArray)
            // console.log(dataArray);
            const len =dataArray.length;
            const barWidth=width/len;
            let x=0;
            for(let i=0;i<len;i++){
                const data=dataArray[i];
                const barHeight=data/255*height;
           
                // ctx.fillRect(x,y,barWidth,height)
                
        let v = dataArray[i] / 128.0;
        let y = v * height/2;

        if(i === 0) {
            ctx.moveTo(x, y);
        } else {
            ctx.lineTo(x, y);
        }

        x += barWidth;
            }
            // ctx.lineTo(canvas.width, canvas.height/2);
            ctx.stroke();
        }
        draw();

關(guān)于請求音頻跨域問題解決方案

給獲取的audio DOM添加一條屬性即可

   audio.crossOrigin ='anonymous'

或者直接在 aduio標(biāo)簽中 加入 crossorigin="anonymous"

總結(jié)

雖然現(xiàn)在已經(jīng)有很多開源的對于音頻相關(guān)的庫,但如果真正的想要去了解,去學(xué)習(xí)音頻相關(guān)的東西。必須要去深入學(xué)習(xí)相關(guān)的Web Audio API,當(dāng)然這里只是用了其中兩種的方法去實(shí)現(xiàn)Web Audio去實(shí)現(xiàn)可視化,算是一個(gè)基礎(chǔ)入門,對于文中的createBufferSource,createMediaElementSource,createAnalyser,AudioContextarrayBuffer,decodeAudioData等等相關(guān)的API都需要去了解,在可視化方面,還有多種多樣的方式去繪制動畫,如WebGL。對音頻的處理也不只是在可視化方面。

本文轉(zhuǎn)載于:

https://juejin.cn/post/7205381513339322427

如果對您有所幫助,歡迎您點(diǎn)個(gè)關(guān)注,我會定時(shí)更新技術(shù)文檔,大家一起討論學(xué)習(xí),一起進(jìn)步。

?記錄--關(guān)于前端的音頻可視化-Web Audio文章來源地址http://www.zghlxwxcb.cn/news/detail-595101.html

到了這里,關(guān)于記錄--關(guān)于前端的音頻可視化-Web Audio的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)分析web可視化神器---streamlit框架,無需懂前端也能搭建出精美的web網(wǎng)站頁面

    數(shù)據(jù)分析web可視化神器---streamlit框架,無需懂前端也能搭建出精美的web網(wǎng)站頁面

    ?? 歡迎大家來到景天科技苑?? ???? 養(yǎng)成好習(xí)慣,先贊后看哦~???? 所屬的專欄: 數(shù)據(jù)分析系統(tǒng)化教學(xué),零基礎(chǔ)到進(jìn)階實(shí)戰(zhàn) 景天的主頁: 景天科技苑 Streamlit是一個(gè)免費(fèi)的開源框架,用于快速構(gòu)建和共享漂亮的數(shù)據(jù)科學(xué)Web應(yīng)用程序。它是一個(gè)基于Python的庫,專為機(jī)器學(xué)

    2024年03月14日
    瀏覽(22)
  • vue 音頻可視化

    vue 音頻可視化

    ? 書接上文?vue實(shí)現(xiàn)歌詞滾動效果,既然有了歌詞滾動那么今天給大家來個(gè)絕活——音頻可視化。伴隨著各種新技術(shù)的更新迭代,往后大家或多或少都會接觸到這個(gè)技能,因?yàn)樵谖磥砬岸丝梢暬囟〞加袠O其重要的地位,可視化應(yīng)用場景應(yīng)用模式也是千變?nèi)f化,我將以最直

    2024年02月03日
    瀏覽(18)
  • Vue中如何進(jìn)行音頻可視化與音頻頻譜展示

    Vue中如何進(jìn)行音頻可視化與音頻頻譜展示

    隨著音頻應(yīng)用程序的不斷發(fā)展,音頻可視化和音頻頻譜展示成為了重要的功能。在Vue應(yīng)用程序中實(shí)現(xiàn)音頻可視化和音頻頻譜展示可以幫助用戶更好地了解音頻文件的內(nèi)容和特征。本文將介紹如何在Vue應(yīng)用程序中實(shí)現(xiàn)音頻可視化和音頻頻譜展示功能。 音頻可視化是指將音頻信號

    2024年02月15日
    瀏覽(25)
  • python對wav音頻可視化

    python對wav音頻可視化

    本文主要是使用代碼實(shí)現(xiàn)音頻文件(wav)的多種可視化。 1.信號 2.傅里葉變換 3.Mel(梅爾)譜圖 4.log_Mel譜圖 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 為了便于展示,我將信號和傅里葉變換使用plt組合在一起進(jìn)行展示。 結(jié)果展示: 為了便于展示,我將信號和傅里

    2023年04月08日
    瀏覽(26)
  • Vue常用的組件庫大全【前端工程師必備】【移動端、PC端(web端)、數(shù)據(jù)可視化組件庫(數(shù)據(jù)大屏) 、動畫組件庫、3D組件庫】

    Vue常用的組件庫大全【前端工程師必備】【移動端、PC端(web端)、數(shù)據(jù)可視化組件庫(數(shù)據(jù)大屏) 、動畫組件庫、3D組件庫】

    1)Vant ui ??有贊移動 UI 組件庫,支持 Vue2/3 微信小程序,支付寶小程序 https://vant-contrib.gitee.io/vant/v2/#/zh-CN/col Vant 是由有贊前端團(tuán)隊(duì)開發(fā)的一套基于 Vue.js 的移動端 UI 組件庫,它包含了豐富的組件和功能,可以幫助開發(fā)者快速構(gòu)建高質(zhì)量的移動應(yīng)用。Vant 以簡潔易用和高質(zhì)量

    2024年02月04日
    瀏覽(26)
  • Android 音頻可視化:頻譜特效的探索與實(shí)踐

    Android 音頻可視化:頻譜特效的探索與實(shí)踐

    音頻可視化,一言以蔽之,就是聲音到圖像的轉(zhuǎn)換。 隨著視覺工業(yè)時(shí)代的到來,用戶逐漸重視產(chǎn)品的極致體驗(yàn),在市場上諸多優(yōu)秀的音樂類APP中, 頻譜動效 是一個(gè)經(jīng)典的應(yīng)用場景: 圖片來源:咪咕音樂 本文以 Android 端為例,從音頻信號 數(shù)據(jù)的獲取 、 數(shù)據(jù)的處理 、 常見問

    2024年02月15日
    瀏覽(21)
  • Pixi + Tone 實(shí)現(xiàn)簡單midi音頻可視化

    Pixi + Tone 實(shí)現(xiàn)簡單midi音頻可視化

    Pixi.js 是一個(gè)前端圖形渲染庫,使用精靈技術(shù)繪制高性能的圖形。 Tone.js是一個(gè)前端音頻框架,對web audio api進(jìn)行了封裝,可以快速創(chuàng)建音頻樣本、音頻效果、進(jìn)行音頻分析和音頻播放。 @tonejs/midi是tonejs的一個(gè)插件,可以講midi文件轉(zhuǎn)化為Tone.js可以解析的json格式。 首先需要講

    2024年02月16日
    瀏覽(40)
  • 關(guān)于可視化大屏適配

    vw、vh方案: 原理:按照設(shè)計(jì)稿的尺寸,將px按比例計(jì)算轉(zhuǎn)為vw和vh; 優(yōu)點(diǎn):不會存在失真情況、可以動態(tài)計(jì)算圖表的寬高,字體等,靈活性較高,當(dāng)屏幕比例跟 ui 稿不一致時(shí),不會出現(xiàn)兩邊留白情況; 缺點(diǎn):類似第三方echart圖表都需要單獨(dú)做字體、間距、位移的適配,比較

    2024年04月16日
    瀏覽(23)
  • 關(guān)于簡單的數(shù)據(jù)可視化

    關(guān)于簡單的數(shù)據(jù)可視化

    1. 安裝數(shù)據(jù)可視化必要的openpyxl、pandas,matplotlib等軟件包 ?使用清華源,命令如下: 安裝成功后,可以進(jìn)入下一步。 2.?這里新建一個(gè)Excel表格方便說明一下: 運(yùn)行代碼生成如下表格: 3.?對性別進(jìn)行可視化操作--繪制餅圖: 運(yùn)行結(jié)果如下圖所示: ?4.?對姓名和年齡進(jìn)行可視

    2024年02月03日
    瀏覽(19)
  • HTML5+CSS3+JS小實(shí)例:音頻可視化

    HTML5+CSS3+JS小實(shí)例:音頻可視化

    實(shí)例:音頻可視化 技術(shù)棧:HTML+CSS+JS 效果: 源碼: 【HTML】 【CSS】

    2024年01月18日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包