我正在使用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); }
此解决方案中可能存在某些内容如何将音频数据数组转换为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();