Lin*_*ing 8 audio ios html5-audio cordova web-audio-api
我正在使用Phonegap为Ios构建一个卡拉OK应用程序.
我在www/assets文件夹中有音频文件,我可以使用media.play()函数播放
这允许用户收听背景音轨.当媒体正在播放另一个Media实例正在录制时.
录音完成后,我需要将录音文件放在背景音轨上,我不知道如何进行录音.
我认为可能有用的一种方法是使用WEb Audio API - 我从HTML5 Rocks获取了以下代码,它将 两个文件加载到AudioContext中,并允许我同时播放这两个文件.但是,我想要做的是将两个缓冲区写入单个.wav文件中.有什么办法可以将source1和source2合并到一个新文件中吗?
var context;
var bufferLoader;
function init() {
// Fix up prefixing
window.AudioContext = window.AudioContext || window.webkitAudioContext;
context = new AudioContext();
bufferLoader = new BufferLoader(
context,
[
'backingTrack.wav',
'voice.wav',
],
finishedLoading
);
bufferLoader.load();
}
function finishedLoading(bufferList) {
// Create two sources and play them both together.
var source1 = context.createBufferSource();
var source2 = context.createBufferSource();
source1.buffer = bufferList[0];
source2.buffer = bufferList[1];
source1.connect(context.destination);
source2.connect(context.destination);
source1.start(0);
source2.start(0);
}
function BufferLoader(context, urlList, callback) {
this.context = context;
this.urlList = urlList;
this.onload = callback;
this.bufferList = new Array();
this.loadCount = 0;
}
BufferLoader.prototype.loadBuffer = function(url, index) {
// Load buffer asynchronously
var request = new XMLHttpRequest();
request.open("GET", url, true);
request.responseType = "arraybuffer";
var loader = this;
request.onload = function() {
// Asynchronously decode the audio file data in request.response
loader.context.decodeAudioData(
request.response,
function(buffer) {
if (!buffer) {
alert('error decoding file data: ' + url);
return;
}
loader.bufferList[index] = buffer;
if (++loader.loadCount == loader.urlList.length)
loader.onload(loader.bufferList);
},
function(error) {
console.error('decodeAudioData error', error);
}
);
}
request.onerror = function() {
alert('BufferLoader: XHR error');
}
request.send();
}
BufferLoader.prototype.load = function() {
for (var i = 0; i < this.urlList.length; ++i)
this.loadBuffer(this.urlList[i], i);
}
Run Code Online (Sandbox Code Playgroud)
此解决方案中可能存在某些内容如何将音频数据数组转换为wav文件? 据我所知,他们交错两个缓冲区并将它们编码为.wav,但我无法弄清楚他们将文件写入文件(保存新的wav文件)的任何想法?
下面的答案 - 并没有真正帮助,因为我使用Web Audio Api(javascript)而不是IOS
解决方案是使用offlineAudioContext
步骤如下:1.使用BufferLoader将两个文件作为缓冲区加载2.创建一个OfflineAudioContext 3.将两个缓冲区连接到OfflineAudioContext 4.启动两个缓冲区5.使用offline startRendering函数6.设置offfline.oncomplete函数获取renderedBuffer的句柄.
这是代码:
offline = new webkitOfflineAudioContext(2, voice.buffer.length, 44100);
vocalSource = offline.createBufferSource();
vocalSource.buffer = bufferList[0];
vocalSource.connect(offline.destination);
backing = offline.createBufferSource();
backing.buffer = bufferList[1];
backing.connect(offline.destination);
vocalSource.start(0);
backing.start(0);
offline.oncomplete = function(ev){
alert(bufferList);
playBackMix(ev);
console.log(ev.renderedBuffer);
sendWaveToPost(ev);
}
offline.startRendering();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1132 次 |
最近记录: |