【问题标题】:Web Audio Api - Download edited MP3Web Audio Api - 下载已编辑的 MP3
【发布时间】:2015-08-16 15:47:03
【问题描述】:

我目前正在编辑具有多种效果的 mp3 文件

var mainVerse = document.getElementById('audio1');

var s = source;
source.disconnect(audioCtx.destination);

for (var i in filters1) {
 s.connect(filters1[i]);
 s = filters1[i];
}

s.connect(audioCtx.destination);

带有过滤器的 mp3 在网络上相应地播放。是否可以使用网络音频 api 或任何写入 mp3 容器 javascript 库的方式创建和下载具有这些新效果的新 mp3 文件?如果不是在网络上解决这个问题的最佳方法是什么?

更新 - 使用 OfflineAudioContext

使用来自https://developer.mozilla.org/en-US/docs/Web/API/OfflineAudioContext/oncomplete的示例代码

我试过这样使用离线节点;

var audioCtx = new AudioContext();
var offlineCtx = new OfflineAudioContext(2,44100*40,44100);

osource = offlineCtx.createBufferSource();

function getData() {
      request = new XMLHttpRequest();
      request.open('GET', 'Song1.mp3', true);
      request.responseType = 'arraybuffer';
      request.onload = function() {
        var audioData = request.response;
        audioCtx.decodeAudioData(audioData, function(buffer) {
          myBuffer = buffer;
          osource.buffer = myBuffer;
          osource.connect(offlineCtx.destination);
          osource.start();
          //source.loop = true;
          offlineCtx.startRendering().then(function(renderedBuffer) {
            console.log('Rendering completed successfully');
            var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); 
            var song = audioCtx.createBufferSource();
            song.buffer = renderedBuffer;
            song.connect(audioCtx.destination);
            song.start();
            rec = new Recorder(song, {
                workerPath: 'Recorderjs/recorderWorker.js'
            });   

            rec.exportWAV(function(e){
                rec.clear();
                Recorder.forceDownload(e, "filename.wav");
            });
          }).catch(function(err) {
              console.log('Rendering failed: ' + err);
              // Note: The promise should reject when startRendering is called a second time on an OfflineAudioContext
          });
        });
      }
      request.send();
    }
    // Run getData to start the process off
getData();

仍然让录音机下载一个空文件,我正在使用歌曲源作为录音机的源。歌曲播放和他的代码的一切,但录音机不下载它

【问题讨论】:

  • 你在寻找recorder.js github.com/mattdiamond/Recorderjs
  • @RaphaelSerota 你好,我刚刚查看了库,我不知道如何让forceDownload 使用现有的源(而不是使用麦克风录制,即rec.record() , rec.stop()) .我目前正在执行以下rec = new Recorder(s, { workerPath: 'Recorderjs/recorderWorker.js' }); rec.exportWAV(function(e){ Recorder.forceDownload(e, "filename.wav"); });...但是 filename.wav 文件是一个空的 wav 文件...有什么建议吗?

标签: javascript audio web-audio-api


【解决方案1】:

使用https://github.com/mattdiamond/Recorderjs 录制 .wav 文件。然后使用https://github.com/akrennmair/libmp3lame-js 将其编码为.mp3。

这里有一个很棒的指南,如果你需要帮助的话:http://audior.ec/blog/recording-mp3-using-only-html5-and-javascript-recordmp3-js/

更新

尝试移动

rec = new Recorder(song, {
    workerPath: 'Recorderjs/recorderWorker.js'
});

使其位于开始渲染的调用上方,并将其连接到 osource,如下所示:

rec = new Recorder(osource, {
      workerPath: 'Recorderjs/recorderWorker.js'
}); 
osource.connect(offlineCtx.destination);
osource.start();
offlineCtx.startRendering().then(function(renderedBuffer) {
     .....

【讨论】:

  • 您好,我刚刚查看了 recorderJS 库,我不确定如何让 forceDownload 使用现有的源(而不是使用麦克风录制,即 rec.record() , rec.stop() )。我目前正在执行以下rec = new Recorder(s, { workerPath: 'Recorderjs/recorderWorker.js' }); rec.exportWAV(function(e){ Recorder.forceDownload(e, "filename.wav"); }); ...但是 filename.wav 文件是一个空的 wav 文件...有什么建议吗?
  • 那是因为(如果以上就是你所做的一切)Web Audio 中的标准上下文是实时呈现的,所以如果你在没有先播放音频的情况下这样做,你将一无所有。您必须在录音机上调用 .record() ,然后播放处理过的音频以使其录制任何内容,然后停止它并强制下载。或者,看看不实时呈现的离线上下文(可能是你想要的)developer.mozilla.org/en-US/docs/Web/API/OfflineAudioContext@Thatdude1
  • 嘿,我已经更新了我尝试使用离线上下文但仍然没有下载文件的问题。有什么建议吗?谢谢
猜你喜欢
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多