当前位置:首页 > JavaScript

js实现录音进度条回放

2026-03-02 01:57:39JavaScript

实现录音进度条回放的关键步骤

录音与存储音频数据
使用浏览器提供的 MediaRecorder API 进行录音,将录制的音频数据存储为 Blob 对象或 ArrayBuffer。录音过程中需记录时间戳,用于后续进度条同步。

js实现录音进度条回放

navigator.mediaDevices.getUserMedia({ audio: true })
  .then(stream => {
    const mediaRecorder = new MediaRecorder(stream);
    const audioChunks = [];

    mediaRecorder.ondataavailable = event => {
      audioChunks.push(event.data);
    };

    mediaRecorder.start();
  });

生成可播放的音频对象
录音结束后,将存储的音频数据合并为单一 Blob,并创建 URL.createObjectURL 生成可播放的音频资源。

js实现录音进度条回放

mediaRecorder.onstop = () => {
  const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
  const audioUrl = URL.createObjectURL(audioBlob);
  const audio = new Audio(audioUrl);
};

进度条与播放同步
通过 audio 元素的 timeupdate 事件监听播放进度,实时更新进度条的 UI。进度条可使用 <input type="range"> 或自定义 <div> 实现。

audio.addEventListener('timeupdate', () => {
  const progress = (audio.currentTime / audio.duration) * 100;
  document.getElementById('progress-bar').style.width = `${progress}%`;
});

允许用户交互拖动进度条
为进度条添加事件监听,当用户拖动时调整音频的 currentTime 实现跳转播放。

const progressBar = document.getElementById('progress-bar-container');
progressBar.addEventListener('click', (e) => {
  const percent = e.offsetX / progressBar.offsetWidth;
  audio.currentTime = percent * audio.duration;
});

完整代码示例

<!-- HTML部分 -->
<div id="progress-bar-container" style="width: 100%; height: 10px; background: #ddd;">
  <div id="progress-bar" style="width: 0%; height: 100%; background: #4CAF50;"></div>
</div>
<button id="record">开始录音</button>
<button id="stop">停止录音</button>
<button id="play">播放</button>

<script>
  let mediaRecorder, audioChunks = [], audio;

  document.getElementById('record').addEventListener('click', () => {
    navigator.mediaDevices.getUserMedia({ audio: true })
      .then(stream => {
        mediaRecorder = new MediaRecorder(stream);
        mediaRecorder.ondataavailable = e => audioChunks.push(e.data);
        mediaRecorder.start();
      });
  });

  document.getElementById('stop').addEventListener('click', () => {
    mediaRecorder.stop();
    mediaRecorder.stream.getTracks().forEach(track => track.stop());
  });

  document.getElementById('play').addEventListener('click', () => {
    const audioBlob = new Blob(audioChunks, { type: 'audio/wav' });
    audio = new Audio(URL.createObjectURL(audioBlob));
    audio.addEventListener('timeupdate', updateProgressBar);
    audio.play();
  });

  function updateProgressBar() {
    const progress = (audio.currentTime / audio.duration) * 100;
    document.getElementById('progress-bar').style.width = `${progress}%`;
  }

  document.getElementById('progress-bar-container').addEventListener('click', (e) => {
    const percent = e.offsetX / e.target.offsetWidth;
    audio.currentTime = percent * audio.duration;
  });
</script>

注意事项

  1. 兼容性检查:确保浏览器支持 MediaRecorder API(部分旧浏览器需 polyfill)。
  2. 性能优化:长时间录音时需分片处理音频数据,避免内存溢出。
  3. UI 反馈:添加录音状态提示(如麦克风图标闪烁)和播放状态显示。

标签: 进度条js
分享给朋友:

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…