javascript - 使用网络音频 api 和 wavesurfer.js 剪切和粘贴音频

标签 javascript ruby-on-rails html audio web-audio-api

我目前正在尝试制作一个网络编辑器,允许用户轻松调整其音频文件的基本设置,作为一个插件,我集成了 wavesurfer.js,因为它具有非常简洁的跨浏览器波形解决方案。

在为功能的必备列表编制索引后,我决定剪切和粘贴对于使该产品正常工作至关重要,但是在花费数小时试图弄清楚如何在现有库中实现它甚至开始从头开始重建 wavesurfer.js 功能以理解我尚未成功的逻辑。

我的问题是,是否有人可以给我一些关于如何开始构建剪切和粘贴功能的指示,或者甚至是一个示例,我将不胜感激。

提前致谢!

wavesurfer 插件: http://wavesurfer-js.org

采摘网页编辑器 http://plucked.de

编辑解决方案(实例是 wavesurfer 对象。):

function cut(instance){
  var selection = instance.getSelection();
  if(selection){
    var original_buffer = instance.backend.buffer;
    var new_buffer      = instance.backend.ac.createBuffer(original_buffer.numberOfChannels, original_buffer.length, original_buffer.sampleRate);

    var first_list_index        = (selection.startPosition * original_buffer.sampleRate);
    var second_list_index       = (selection.endPosition * original_buffer.sampleRate);
    var second_list_mem_alloc   = (original_buffer.length - (selection.endPosition * original_buffer.sampleRate));

    var new_list        = new Float32Array( parseInt( first_list_index ));
    var second_list     = new Float32Array( parseInt( second_list_mem_alloc ));
    var combined        = new Float32Array( original_buffer.length );

    original_buffer.copyFromChannel(new_list, 0);
    original_buffer.copyFromChannel(second_list, 0, second_list_index)

    combined.set(new_list)
    combined.set(second_list, first_list_index)

    new_buffer.copyToChannel(combined, 0);

    instance.loadDecodedBuffer(new_buffer);
  }else{
    console.log('did not find selection')
  }
}

最佳答案

阅读此 answer建议您可以创建一个空的 AudioBuffer,其大小为您要复制的音频片段的大小(大小 = 以秒为单位的长度⨉ 采样率),然后用该片段中的数据填充其 channel 数据。

所以代码可能是这样的:

var originalBuffer = wavesurfer.backend.buffer;
var emptySegment = wavesurfer.backend.ac.createBuffer(
    originalBuffer.numberOfChannels,
    segmentDuration * originalBuffer.sampleRate,
    originalBuffer.sampleRate
);
for (var i = 0; i < originalBuffer.numberOfChannels; i++) {
    var chanData = originalBuffer.getChannelData(i);
    var segmentChanData = emptySegment.getChannelData(i);
    for (var j = 0, len = chanData.length; j < len; j++) {
        segmentChanData[j] = chanData[j];
    }
}

emptySegment; // Here you go!
              // Not empty anymore, contains a copy of the segment!

关于javascript - 使用网络音频 api 和 wavesurfer.js 剪切和粘贴音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551854/

相关文章:

JavaScript Promise 返回 Pending 但我只需要值

javascript - 将 Google Analytics 脚本粘贴到我的网站(head.php、header.php 或 page-header.php)?

javascript - 正则表达式部分不匹配字符串

javascript - 如何初始化 Uint8Array?

ruby-on-rails - 有没有办法从 Rails 的 View 中提前退出或 "return"?

ruby-on-rails - Ruby on Rails 应用程序中的 'contact forms' 的解决方案是什么?

ruby-on-rails - 在 Carrierwave 中使用不同的 S3 存储桶进行生产和开发

html - 将 CSS 模块与 Modernizr(类名)一起使用

javascript - ToggleClass 不添加 Jquery 延迟?

javascript - Angular js - 绑定(bind)到函数