Javascript 使用web音频api和wavesurfer.js剪切和粘贴音频
我目前正在尝试制作一个web编辑器,允许用户轻松地调整其音频文件的基本设置,作为一个插件,我集成了wavesurfer.js,因为它的波形有一个非常整洁的跨浏览器解决方案 在为功能列表编制索引后,我决定剪切和粘贴是使该产品正常工作的关键,然而,在花了数小时试图找出如何在现有库中实现这一点,甚至开始从头开始重建wavesurfer.js功能以理解逻辑之后,我还没有成功 我的问题是,是否有人能给我一些关于如何开始构建剪切粘贴功能的建议,或者甚至是一个非常感谢的示例 提前谢谢 wavesurfer插件: 弹拨网络编辑器 编辑解决方案(实例为wavesurfer对象):Javascript 使用web音频api和wavesurfer.js剪切和粘贴音频,javascript,ruby-on-rails,html,audio,web-audio-api,Javascript,Ruby On Rails,Html,Audio,Web Audio Api,我目前正在尝试制作一个web编辑器,允许用户轻松地调整其音频文件的基本设置,作为一个插件,我集成了wavesurfer.js,因为它的波形有一个非常整洁的跨浏览器解决方案 在为功能列表编制索引后,我决定剪切和粘贴是使该产品正常工作的关键,然而,在花了数小时试图找出如何在现有库中实现这一点,甚至开始从头开始重建wavesurfer.js功能以理解逻辑之后,我还没有成功 我的问题是,是否有人能给我一些关于如何开始构建剪切粘贴功能的建议,或者甚至是一个非常感谢的示例 提前谢谢 wavesurfer插件
有趣的问题。我想到的第一个词是。我不能凭经验说话,但如果我想做到这一点,我会这样做: 假设您选择了音频曲目的一个区域,并希望复制该区域,然后从中制作一个新曲目(稍后可能只是将其附加到现有曲目中)
getSelection()
方法。这将为您提供开始位置()
和结束位置()
[秒]
,教程Web音频API
- HTML5音频-播放状态。(不要错过关于时间范围的部分,这看起来是一个合理的尝试选项)
- 这(过时,但值得一看,有趣的链接)
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!
var originalBuffer=wavesurfer.backend.buffer;
var emptySegment=wavesurfer.backend.ac.createBuffer(
原始缓冲区.numberOfChannels,
分段持续时间*原始缓冲区.sampleRate,
原始缓冲液
);
对于(变量i=0;i
Hi vint-i-vuit,非常感谢您的输入。我现在有了一个如何设置的方向,我选择客户端方法,因为后端方法可能太重了。成功后,我将确保回报您,并发布我的解决方案。@dennis:我很高兴听到您现在对挑战有了更多的了解:)另外,再看看我更新的答案,我添加了一些链接,可以帮助您开始使用基于JS的方法。非常感谢!事实上,TimeRanges的文章似乎很有希望,我目前正在开发一个Javascript库,以涵盖这些功能,并结合wavesurferjs的波形。它将在github测试版中尽快托管。非常感谢katspaugh!这太棒了!当我将新段粘贴到原始缓冲区时,是否也有方法重新绘制波形。@丹尼斯,是的,有wavesurfer.loadDecodedBuffer
方法,它需要一个音频缓冲区。看见
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!