vue对音频添加背景音乐

发布于:2025-04-01 ⋅ 阅读:(16) ⋅ 点赞:(0)

说明:
用vue,将name.mp3这段录音文件,添加背景音乐,bg.mp3,然后生成新的文件
提前准备好两个mp3文件,一个录音文件,一个背景音乐,放在public目录里
step1:下载依赖

{
  "name": "untitled3",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "audiobuffer-to-wav": "^1.0.0",
    "axios": "^1.8.4",
    "vue": "^3.5.13"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^5.2.1",
    "vite": "^6.2.0"
  }
}

step2:

<template>
  <div>
    <button @click="mergeAudio">合并音频并下载</button>
  </div>
</template>

<script>
import audioBufferToWav from 'audiobuffer-to-wav';

export default {
  methods: {
    async mergeAudio() {
      try {
        const [mainBuffer, bgBuffer] = await Promise.all([
          this.loadAudio('/name.mp3'),  // 修改为public路径
          this.loadAudio('/bg.mp3')     // 修改为public路径
        ]);

        // 创建离线音频上下文
        const offlineContext = new OfflineAudioContext(
          mainBuffer.numberOfChannels,
          mainBuffer.length,
          mainBuffer.sampleRate
        );

        // 创建主音频源
        const mainSource = offlineContext.createBufferSource();
        mainSource.buffer = mainBuffer;

        // 创建背景音乐源
        const bgSource = offlineContext.createBufferSource();
        bgSource.buffer = bgBuffer;
        bgSource.loop = true;

        // 创建音量控制节点
        const bgGainNode = offlineContext.createGain();
        bgGainNode.gain.value = 0.3; // 背景音乐音量设置为30%

        // 连接节点(移除了背景音乐的直接连接)
        mainSource.connect(offlineContext.destination);
        bgSource.connect(bgGainNode);
        bgGainNode.connect(offlineContext.destination);

        // 启动播放
        mainSource.start(0);
        bgSource.start(0);

        // 渲染音频
        const mixedBuffer = await offlineContext.startRendering();

        // 转换并下载
        this.saveAudio(mixedBuffer);
      } catch (error) {
        console.error('合并失败:', error);
      }
    },

    async loadAudio(url) {
      const response = await fetch(url);
      const arrayBuffer = await response.arrayBuffer();
      return new AudioContext().decodeAudioData(arrayBuffer);
    },

    saveAudio(buffer) {
      // 转换为WAV格式
      const wav = audioBufferToWav(buffer);
      const blob = new Blob([wav], { type: 'audio/wav' });

      // 创建下载链接
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.style.display = 'none';
      a.href = url;
      a.download = `mixed-${Date.now()}.wav`;
      document.body.appendChild(a);
      a.click();
      URL.revokeObjectURL(url);
      document.body.removeChild(a);
    }
  }
};
</script>

end