android - 如何通过重叠 2 个相邻音频文件之间的某些区域来播放音频文件?
问题描述
我有 5 个音频文件,每个文件的长度为 5 秒。我想一个一个地播放每个声音文件,但条件是播放下一个文件的音频文件是否应该在 4 秒后播放,即相邻的音频文件声音应该重叠 1 秒。我该如何实施?您可以推荐哪个最好的音频播放器?
解决方案
您可以在 Java 端进行音频播放的具体工作量在 android 上非常有限。
听起来您需要在播放过程中的某个时间点混合您的声音以重叠。
在我看来,最好的方法是通过一个名为 Oboe 的 C++ 库(我目前正在使用它)。这是由 Google 创建的用于音频播放的库。现在等一下,让我解释一下!我知道实现 C++(尤其是如果你现在只在 Java 堆栈上)可以为你的项目增加一些时间。
想到这一点的原因是,在这种播放音频的方式中(通过双簧管/C++),您将音频样本的各个位物理移动到buffer stream
. C++ 库实际上还有一个 Mixer 类,您可以将 2 个不同的音频样本(实际上最多 100 个)放入其中进行混合,然后最终通过缓冲区流进行渲染。
使用此方法,您可以添加特定逻辑来管理音频何时开始播放(如果相邻,则在 4 秒后)。此时,您可以将下一个剪辑的第一秒与当前播放的剪辑混合。
现在令人兴奋的是,您也许可以在 Java 中复制这个过程!我发现这篇文章可能对你有帮助:
Android:如何混合 2 个音频文件并使用 soundPool 重现它们
现在我警告你,以这种方式(通过缓冲流)渲染音频是一个复杂的过程,可能需要一些额外的研究才能完全理解这个过程。我不能说我知道 Java 音频库的所有功能,但我敢打赌,它们对以您需要的方式混合声音没有太多支持。所以很可能你必须自己混合它,或者你最后的手段可能是使用 NDK (C++)。
希望这个答案有帮助。祝您研究顺利!希望您能找到一种简单有效的方法。(如果你这样做了,别忘了分享你在这个问题上的发现!)
推荐阅读
- javascript - 如何在使用javascript粘贴之前修改复制的文本
- python - 使用 WSGI 从 db 向客户端发送模型更新
- neo4j - Neo4j - 获取给定节点的所有相关节点和关系
- php - 如何在 PHP 中调用和打印“多维数组函数”?
- unit-testing - vue-test-utils 的 setData 没有重新更新组件
- nginx - 为什么 nginx 的 proxy_pass 不直接指向 asp.net 核心应用程序?
- node.js - 猫鼬骨料
- office-js - Excel 加载项 Web 应用程序使用 SSO api 13004 错误
- r - 具有单个输入变量的 kmeans 聚类图
- minecraft - spigot 1.13 启用 worldguard 崩溃 dynmap 显示派系场地