Phonegap 混合音频文件

2023-11-26

我正在使用 Phonegap for Ios 构建一个卡拉 OK 应用程序。

我在 www/assets 文件夹中有音频文件,可以使用 media.play() 函数播放它们

这允许用户收听背景音乐。当媒体正在播放时,另一个媒体实例正在录制。

录音完成后,我需要将录音文件放在背景音轨上,但我不知道如何去做。

我认为可能有效的一种方法是使用 WEB Audio API - 我有以下代码HTML5 摇滚它将两个文件加载到 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.使用离线startRendering函数 6. 设置offline.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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Phonegap 混合音频文件 的相关文章

  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 在 Flutter 中显示 iOS 的 PDF 内联文件

    我正在 flutter 中专门为 iOS 开发一个应用程序 现阶段 我需要向其中添加 PDF 文件 问题是 flutter 没有原生的方式来显示 PDF 文件 据我研究 由此tread https github com flutter fl
  • 将带有地理位置数据的照片保存到照片库 Swift 3

    如何使用地理位置元数据将照片保存到照片库 我已请求 并允许 应用程序访问用户位置 private func allowAccessToUserLocation locationManager CLLocationManager locati
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • iOS 10 的错误? NSDate 日本地区时间描述和 24 小时休息

    这似乎是 iOS 10 的一个错误 在 iOS 8 和 9 中都可以 NSDate date description 的小时描述是错误的 它附加了 24 小时描述和 12 小时描述 我没有使用 NSDateFormatter 只是默认设置
  • Swift 3:如何去除UITableView屏幕截图的灰色区域

    我在从桌面视图的屏幕截图中删除灰色区域时遇到了问题 这是我尝试截图时的输出UITableView 实际上我隐藏了一些tableViewCell这是不需要的 可能这就是区域显示灰色的原因 任何帮助表示赞赏 非常感谢 Answer 我通过使用
  • iOS中的performSelector有什么用

    的作用是什么执行选择器 比较 self btnClicked and self performSelector selector btnClicked void btnClicked NSLog Method Called 两者都对我来说工
  • 如何请求用户开启定位服务

    我需要我的应用程序来访问用户的当前位置 它在应用程序开始时检查用户是否已设置 如果没有 我需要应用程序显示提示以使其使用位置服务 就像警报视图一样 点击按钮 它应该会带您进入 iPhone 上的位置服务屏幕 您可以通过以下代码检查 loca
  • UISearchController 保留问题

    我正在尝试使用 UISearchController 但是我遇到了无法解决的保留问题 MainTableview 有两个部分 第1节 基于某些正则表达式过滤数据 第2节 All Data 我将 UISearchController 添加到我
  • 如何使用 Swift 获取 YouTube 频道的所有播放列表?

    我的问题不是关于从一般频道检索视频 我只想获取该频道创建的所有 播放列表 并检索每个播放列表的缩略图 标题和视频数量 这是一个 YouTube 频道示例 正如您所看到的 有很多已创建的播放列表 截至目前 我只能获取某个频道最新上传的视频 在
  • iPhone 快照,包括键盘

    我正在寻找拍摄整个 iPhone 屏幕 包括键盘 的正确方法 我找到了一些截取屏幕的代码 CGRect screenCaptureRect UIScreen mainScreen bounds UIView viewWhereYouWant
  • PrepareForSegue之谜

    我在两个不同的 VC 中有一个prepareForSegue 方法 一个使用一个if声明 而另一个旨在使用switch 除了名称之外 代码几乎相同 这个效果很好 void prepareForSegue UIStoryboardSegue
  • iOS WKWebView.scrollView委托导致BAD_ACCESS

    我的 viewController 有一个 UIView 属性 其中包含一个 WKWebView 我将 WKWebView rollView 委托设置为我的 viewController 它是我的 UIView 子类的公共函数 并在我的 v
  • Xcode 9 中的“addingPercentEncoding”是否损坏?

    在 Swift 3 x 和 Xcode 9 beta 2 中 使用addingPercentEncoding https developer apple com documentation swift string 1690785 addi
  • 自定义 MKAnnotationView - 如何捕获触摸而不忽略标注?

    我有一个自定义 MKAnnotationView 子类 它完全按照我想要的方式显示视图 在那个视图中 我有一个按钮 我想捕获按钮上的事件来执行操作 这很好用 但是 我不希望标注被忽略或消失 基本上 触摸标注中的按钮将开始播放声音 但我想保留
  • 我应该在哪个方法中设置 UITextField 的委托?

    在 viewDidLoad 或 init 方法中设置 UITextField 的委托是一个好习惯吗 我尝试在 init 方法中将委托设置为 self 但它没有调用相应的委托方法 当我将代码移动到 viewDidLoad 中时 它注册为将 s
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • 显示键盘时如何在 TextView 下方添加更多填充

    当我在 ScrollView 中有 TextField 并点击它时 键盘会按预期显示 但似乎 TextField 已向上移动到足以显示输入区域 但我希望移动到足够的位置 以便整体可见 否则它看起来像是被剪裁了的 我找不到改变这种行为的方法
  • 为什么这个 SKPhysicsJointPin 不能将这 2 个精灵保持在一起?

    我显然不太了解 SKPhysicsJoint 但是除了 Apple 文档之外 网上的信息还很少 下面的代码有什么问题 我认为应该保持头部和颈部永久连接 我的意图是它们就像两张带有大头针的纸 这样它们可以旋转一点 但不仅仅是完全分开 当我运行
  • ResponseSerializer“无法使用 Swift 3 调用非函数类型“NSHTTPURLResponse”的值?

    我一直在使用以下代码 没有出现任何问题 直到更新到 Xcode 8 beta 6 它类似于这个例子 https github com Alamofire Alamofire generic response object serializa

随机推荐

  • 如何在Java中使用Collections.sort()?

    我得到了一个物体Recipe实现Comparable
  • 需要在每个 cron 作业之前设置 rvm 环境

    我大致按照这组说明的第一部分中概述的模式安装和配置 RVM http blog ninjahideout com posts a guide to a nginx passenger and rvm server 基本上 这意味着没有预构建
  • 带有单击事件处理程序的 WPF 命令

    当我使用Command in a Button控制加入的事件处理程序Click事件永远不会引发 我怎样才能使用Command并处理Click事件处理程序 您可以将 ICommand 附加到另一个属性并从 Click 处理程序中执行它
  • Chrome DevTools - 性能选项卡摘要

    在 Chrome DevTools 的 性能 选项卡上 摘要 面板显示多个活动类别的计时 加载 脚本编写 渲染 绘画 系统 空闲 我似乎无法在 DevTools 文档中找到每个类别所代表的内容的简明描述 我觉得我必须忽略一些显而易见的事情
  • 如何将两个div并排放置? [复制]

    这个问题在这里已经有答案了 考虑以下代码 wrapper width 500px border 1px solid black first width 300px border 1px solid red second border 1px
  • 如何将 package.json 数组传递给 grunt.js

    有没有办法将数组从 package json 文件传递 给 grunt js 我尝试了几种不同的方法 但似乎都不起作用 我目前有 global module false module exports function grunt Proje
  • 如何制作模块向量?

    我想实例化一个一维元素数组 并且元素扩展模块 我该怎么做 如果我说我最好的猜测 那就是 val elements Vec 64 new element 我收到以下错误消息 error Users mykland work chisel ar
  • 如何从 PHP 调用 Perl 脚本?

    我有兴趣了解如何在 PHP 中调用 运行 Perl 脚本 您可以在 Php 代码中使用简单的 Php Perl 扩展 这将允许您执行代码和 Perl 变量 函数以及实例化对象 perl new Perl perl gt require te
  • 如何在启动repl时默认加载ns

    我用的是lein2 我想在 repl 启动时默认加载一些 ns 当为该项目执行 lein2 repl 时 是否可以在 project clj 中指定应加载的 ns 你会在其中找到很多答案示例项目 Options to change the
  • Bootstrap:在标签内输入

    为了避免表单上的每个输入元素都有一个 ID 我想将表单输入放在label 引导程序 3 我的问题是 这导致行之间有额外的垂直间距 输入没有填充其父级的整个宽度 并且输入未对齐
  • 使用UINT64_C的目的?

    我在 boost 源中找到了这一行 const boost uint64 t m UINT64 C 0xc6a4a7935bd1e995 我想知道这里使用宏的目的是什么 这一切所做的就是添加ULL到提供的常数 我认为它可能会被用来让人们更难
  • 剃须刀要求;当使用(Html.BeginForm())时

    using Html BeginForm Name Html TextBoxFor o gt o Name
  • C# 中的拍手声检测

    我希望能够检测到拍手声 对于任何形式的声音识别都很陌生 有什么简单的方法可以做到这一点吗 如果没有 有什么好的 C 声音识别 检测资源吗 我的目标是通过一些基本的基于拍手的控制来实现客户媒体中心的自动化 以前也有人问过类似的问题 给定音频流
  • NoSuchMethodException: springframework.boot.autoconfigure.http.HttpMessageConverters

    我想将 Java 9 与 Spring 一起使用 但我得到例外 Caused by org springframework aop framework AopConfigException Unable to instantiate pro
  • 使用 Gradle 从现有 pom.xml 文件中读取信息?

    在蚂蚁金服中Maven Ant 任务可用于读取 Maven 属性 如下所示
  • 减慢音频文件的播放速度而不改变其音调?

    我正在申请大学音乐专业 我正在考虑的一个功能是减慢音乐播放速度而不改变其音调 我已经在商业软件中看到了这一点 但找不到任何库或开源应用程序可以执行类似的操作 那里有图书馆吗 如何从头开始从各种文件格式完成此操作 注意 我正在使用java工作
  • 自定义日志记录以在运行时收集消息

    有没有办法在运行时创建一个 log4j Logger 将日志消息收集到缓冲区中 我目前有一个记录许多事件的类 对于需要监视记录的事件的远程应用程序 我想只交换记录到缓冲区的记录器 然后检索缓冲区 而不是重构该类 例如 给定类似的东西 Cla
  • 如何使用谓词过滤子实体集合?

    我有一个实体服务 需要根据 id 列表过滤子实体的集合 我的服务有一个公共方法 它接收父实体的 id 和他的一些子实体的 id 列表 默认情况下 我知道 JPA 将获取所有相关实体 这是他的实际行为 但我们需要努力提高服务的性能 因此 我只
  • 检索方法或构造函数的调用者实例(不是类)

    是否可以检索方法 构造函数的调用者实例 这个问题已经发布 但每次答案都在谈论调用者类 使用堆栈跟踪 而不是调用者实例 如果存在解决方案 那么构建对象图 具有公共超类型 并使用默认构造函数处理父子导航会非常方便 public class Te
  • Phonegap 混合音频文件

    我正在使用 Phonegap for Ios 构建一个卡拉 OK 应用程序 我在 www assets 文件夹中有音频文件 可以使用 media play 函数播放它们 这允许用户收听背景音乐 当媒体正在播放时 另一个媒体实例正在录制 录音