Phonegap混合音频文件

 壳牌盛行 发布于 2022-12-31 14:29

我正在使用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

1 个回答
  • 解决方案是使用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();
    

    2022-12-31 14:32 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有