在JavaScript中使用波形构建自定义音频播放器

目录

介绍

分步说明

读取音频文件

添加播放/暂停和停止按钮

从音频数据生成数据点

将音频播放效果添加到波形

示例代码

兴趣点


介绍

如果您正在某个需要向用户播放一些音频的平台工作,例如,出售一些音频文件,那么展示其波形非常棒,这样用户就会对音频的结构和您的平台可以做什么印象深刻。您可以使用 Web音频API JavaScript中构建一个简单的音频播放器应用程序。API允许您从音频文件中提取频率、波形和其他数据。提取的数据可用于通过生成波进行可视化。当您处理音频波形生成的大数据时,绘制波形更平滑、更快而网页中没有任何延迟非常重要。作为开发人员,无论页面中的内容负载如何,我都更喜欢保持页面速度更快。如果我们尝试在页面中绘制波形,则必须牢记性能并构建一些简单的库来实现它。相反,我使用 CanvasJS图表来可视化可以在几毫秒内绘制数百万个数据点的波形。

底层技术是使用Web Audio APICanvasJSJavaScript中构建的。但是,它适用于AngularReact或任何其他JavaScript框架。

分步说明

要播放或可视化音频的波形,音频文件是必需的。让我们添加一个输入字段,允许用户从他们的机器浏览MP3文件。为了简单起见,我将其限制为允许用户仅浏览MP3文件。但是,Web音频API支持WAVMP3AACOGG和其他格式。

<input type="file" class="file-input" id="mp3-input" accept="audio/mp3">

读取音频文件

Web音频API中,我们需要获取音频数据ArrayBuffer并将其传递给BufferSource以获取音频。使用 AudioContext.decodeAudioData 方法获取声音的音频缓冲区。AudioBuffer解码后被重新采样为 AudioContext 的采样率,然后传递给回调或promise

let margin = 10,
        chunkSize = 500,
        height = chart.get("height"),
scaleFactor = (height - margin * 2) / 2;

audioContext = new AudioContext();

let buffer = await file.arrayBuffer(),
        audioBuffer = await audioContext.decodeAudioData(buffer),
        float32Array = audioBuffer.getChannelData(0);

let array = [], i = 0, length = float32Array.length;

while (i < length) {
    array.push(
        float32Array.slice(i, i += chunkSize).reduce(function (total, value) {
            return Math.max(total, Math.abs(value));
        })
    );
}

添加播放/暂停和停止按钮

让我们添加两个按钮,一个用于控制播放/暂停,另一个用于停止。通常,按钮中的图标/文本应显示用户可以执行的操作。播放音频时,暂停音频时显示暂停文本/图标和播放文本/图标。您可以轻松地在播放和暂停状态之间切换以实现此目的。在Web音频API中,可以检查音频上下文的状态,并根据当前状态恢复或挂起音频。

<button class="button" id="play-pause-btn" 
title="Play / Pause"><span class="pp-icon"></span></button>
<button class="button" id="stop-btn" 
title="Stop"><span class="stop-icon"></span></button>

if(audioContext.state === 'running') {
    audioContext.suspend().then(() => {
        playPauseBtn.classList.toggle('is-play');
    });
}
else if(audioContext.state === 'suspended') {
    audioContext.resume().then(() => {
        playPauseBtn.classList.toggle('is-play');
    });
}

停止音频非常简单。Web音频API可以选择通过调用 stop()方法来停止source

source.stop();

从音频数据生成数据点

CanvasJS支持许多图表类型,如折线图,面积图,饼图,范围图,财务图表等,适用于不同的数据集和用例。在这种情况下,范围区域非常适合——因为它看起来像音频波。我们唯一的任务是从音频文件生成数据点,并将其传递给图表。CanvasJS像魅力一样为您绘制波浪图。

let dps = []
for (let index in array) {
    dps.push({ x: margin + Number(index), 
    y: [50 - array[index] * scaleFactor, 50 + array[index] * scaleFactor]});
}

chart.options.data[0].dataPoints = dps;
chart.render();

将音频播放效果添加到波形

当音频开始播放时,对波形中已播放的区域进行着色是一个不错的选择。添加带状线以在图表中显示阴影区域,并每隔几毫秒或1秒更新一次。并在音频停止播放后停止更新它。

source.onended = () => {
    chart.axisX[0].stripLines[0].set("endValue", chart.axisX[0].get("maximum"));
    clearInterval(intervalId);
}
let intervalId = setInterval(() => {
    chart.axisX[0].stripLines[0].set
    ("endValue", audioContext.currentTime * 
    (chart.data[0].dataPoints.length / audioBuffer.duration));
}, 250);

啧啧!您刚刚构建了一个自定义音频播放器,其中包含播放,暂停和停止选项以及使用CanvasJS范围区域图生成的音频波形。您甚至可以使用柱形图,范围柱形图确实以不同的方式显示波浪。您甚至可以使用简单的CSS属性自定义音频播放器的外观,并通过更改CanvasJS图表属性与波形匹配。

CanvasJS图表生成的波形可以与音频/视频播放器集成,以使其对用户具有吸引力。库有更多的自定义选项来更改外观和感觉——这使您可以更灵活地自定义图表外观和感觉,以匹配您的网站/播放器主题。在本教程中,我禁用了图表交互性,以便仅展示波形。但是,CanvasJS支持交互性,当您将鼠标悬停在图表上时,它会显示工具提示和突出显示。检查此 JSFiddle 以获取实时代码。

示例代码

https://jsfiddle.net/vishwasr/768vqdyp/embedded/

兴趣点

您将了解使用Web音频APICanvasJS API是多么有趣。当涉及到CanvasJS时,您将学习并享受如何自定义颜色和动态更新图表,以使波形对用户更具吸引力。

示例代码JSFiddle

https://www.codeproject.com/Tips/5338983/Build-Custom-Audio-Player-with-Waveform-in-JavaScr

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以给你一些关于创建自定义HTML5音频播放器的建议。首先,你需要了解HTML5 audio元素的基本用法和属性。然后,你可以使用CSS来美化你的播放器,添加播放/暂停按钮、进度条和音量控制等功能。最后,你需要使用JavaScript来控制播放器的行为,例如播放、暂停、获取音频长度和当前进度等。 以下是一些可能有用的代码片段: 1. HTML5 audio元素: ```html <audio id="myAudio" src="audio.mp3"></audio> ``` 2. 播放/暂停按钮: ```html <button id="playButton">Play</button> ``` ```javascript var audio = document.getElementById("myAudio"); var playButton = document.getElementById("playButton"); playButton.addEventListener("click", function() { if (audio.paused) { audio.play(); playButton.innerHTML = "Pause"; } else { audio.pause(); playButton.innerHTML = "Play"; } }); ``` 3. 进度条: ```html <div id="progressBar"> <div id="progress"></div> </div> ``` ```css #progressBar { width: 100%; height: 10px; background-color: #ccc; } #progress { width: 0%; height: 100%; background-color: #000; } ``` ```javascript var audio = document.getElementById("myAudio"); var progressBar = document.getElementById("progressBar"); var progress = document.getElementById("progress"); audio.addEventListener("timeupdate", function() { var percent = (audio.currentTime / audio.duration) * 100; progress.style.width = percent + "%"; }); ``` 4. 音量控制: ```html <input type="range" id="volumeControl" min="0" max="1" step="0.1" value="1"> ``` ```javascript var audio = document.getElementById("myAudio"); var volumeControl = document.getElementById("volumeControl"); volumeControl.addEventListener("input", function() { audio.volume = volumeControl.value; }); ``` 希望这些代码片段能帮助你创建自定义HTML5音频播放器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值