同时播放多个音轨并进行同步

2024-01-27

最近我在 Audacity 有一个音频项目,其中有多个曲目。它有分开的人声和分开的乐器。

我已将每个曲目导出为 WAV(16 位)文件。我有 5 个文件,5 个曲目。所有文件都超过300MB,长度为25分钟。

我试图使用媒体播放器同时播放它们:

我为每个文件创建了 Mediaplayer 实例 mp1、mp2、mp3、mp4 和 mp5

我尝试通过以下方式同时播放它们:

启动所有媒体播放器的默认方式:

mp1.start()
mp2.start()
mp3.start()
mp4.start()
mp5.start()

我观察到两者之间存在一些差距。

我可以大胆地将它们混合并作为单个文件播放。我希望它们单独播放的原因是我想控制android中每个曲目的音量。

我在网上对此进行了很多研究:

我认为问题在于 .start() 命令没有同时启动。

方法一:Asynctask 同时启动所有mp的方法:

所以我尝试使用 Asynctask 并创建 5 个单独的线程,如下所示:

class PlayThread extends AsyncTask<MediaPlayer, Void, Void>
{
    @Override
    protected Void doInBackground(MediaPlayer... player) {

        player[0].start();
        return null;
    }
}

then did

PlayThread[] playThreads = new PlayThread[5];
for (int i = 0; i < 5; i++)
    playThreads[i] = new PlayThread();


playThreads[0].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mp1);
playThreads[1].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mp2);
playThreads[2].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mp3);
playThreads[3].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mp4);
playThreads[4].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mp5);

方法2:使用CyclicBarrier

public void syncedCommand(
        MediaPlayer player1,
        MediaPlayer player2,
        MediaPlayer player3,
        MediaPlayer player4,
        MediaPlayer player5

) {
    final CyclicBarrier commandBarrier = new CyclicBarrier(5, new Runnable() {
        @Override
        public void run() {
            L.m("ALL threads done");
        }
    });
    new Thread(new SyncedCommandService(commandBarrier, player1)).start();
    new Thread(new SyncedCommandService(commandBarrier, player2)).start();
    new Thread(new SyncedCommandService(commandBarrier, player3)).start();
    new Thread(new SyncedCommandService(commandBarrier, player4)).start();
    new Thread(new SyncedCommandService(commandBarrier, player5)).start();
}

private class SyncedCommandService implements Runnable {
    private final CyclicBarrier  mCommandBarrier;
    private MediaPlayer mMediaPlayer;
    private int lengthseek;

    public SyncedCommandService(CyclicBarrier barrier, MediaPlayer player) {
        mCommandBarrier = barrier;
        mMediaPlayer = player;
    }

    @Override public void run() {
        try {
            L.m("Waiting for thread");
            mCommandBarrier.await();
        } catch (InterruptedException | BrokenBarrierException e) {
            e.printStackTrace();
        }

        mMediaPlayer.start();

    }
}

然后使用它们来播放

syncedCommand(mp1,mp2,mp3,mp4,mp5);

在上述两种方法中,轨道之间仍然存在一些延迟,轨道之间存在一些间隙。

后来我在另一篇文章中读到这是不可能的:

在 Android 上同步多个音轨 https://stackoverflow.com/questions/18549445/syncing-multiple-audio-tracks-on-android

问题是每个 MediaPlayer 代表一个单独的流, 这可能会在不同的时间开始。即使你在所有的 他们同时(这是不可能的),没有办法 保证操作系统将加载并实际启动每个操作系统 同时。

据我所知,Android 没有提供同步多个的方法 溪流。即使操作系统确实提供了此功能, 它非常麻烦,而且通常不是 100% 准确。

正确的解决方案是打开单个流,例如使用音频 Track接口,之前自己做MP3解码混音 将数据发送到流。

它提到的解决方案是解码、混合和编码。我是使用音轨执行此方法的新手。我仍然能弄清楚该怎么做。但这会让我

1.动态更改曲目的音量,就像媒体播放器更改每个曲目的音量一样。或者我必须先修复参数,然后混合、播放并检查它是否适合我的需要

2.我可以寻找特定的时间并开始玩吗?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同时播放多个音轨并进行同步 的相关文章

  • Android 中用虚拟键盘捕捉按键按下的情况?

    使用物理键盘 您可以使用按键监听器 http developer android com reference android text method KeyListener html 就像是 myEditText setOnKeyListe
  • 与其他图标相比,AppCompat ShareActionProvider 图标太大

    我将 ActionBarSherlock 更改为 AppCompat v7 我已经完成了使其工作所需的所有更改 但是共享图标 使用 ShareActionProvider 发生了一些奇怪的情况 与其他图标相比 共享图标太大 我还使用支持库进
  • v7 RecyclerView NullPointerException AccessibilityDelegateCompat.getBridge()

    运行我的 recyclerview 列表片段时出现此错误 java lang NullPointerException Attempt to invoke virtual method java lang Object android su
  • 强制用户在 Android 中的 EditText 中输入内容

    我的活动中有几个编辑文本 我希望我的用户在提交表单之前正确输入 我该怎么做 我还有旋转器和 RadioGroup 按钮 你可以加验证在提交按钮上单击 private boolean validateFields int yourDesire
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 使用库来维护免费/付费的应用程序版本

    维护免费 付费应用程序版本的共识似乎是使用库 并从每个活动中设置一个标志 以从代码库中获取不同的功能 这有多安全 据我了解 一个人可以root他们的手机 获取APK 并且可以对其进行反编译 即使代码被混淆 也不难看出该应用程序是带有标志的包
  • 使用 android AudioTrack 在左或右扬声器中播放声音

    我正在应用程序中的 AudioTrack 的帮助下播放声音 但我想在特定扬声器 耳朵中播放声音 即左扬声器或右扬声器或两个扬声器 以下代码是我用来播放声音的 private AudioTrack generateTone double fr
  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • Youtube 退出全屏模式 TextView 可见性问题

    我正在全屏模式下播放视频 当我单击后退按钮时 我可以退出全屏模式 但无法显示我在全屏情况下隐藏的 TextView 要在全屏模式下隐藏 textView 我使用以下代码 Override public void onInitializati
  • 如何以编程方式断开拨出呼叫

    我使用以下代码以编程方式断开呼叫 但它不起作用 private void callDisconnect try TelephonyManager manager TelephonyManager this getSystemService
  • 以编程方式将 TextView 添加到主屏幕小部件

    我想以编程方式将文本视图控件添加到我的主屏幕小部件 在下面的示例中 我使用 TextView 填充 Linearlayout 但是这里应该如何使用 RemoteView 它只接受 xml 资源布局作为参数 public class MyWi
  • 在 Jetpack Compose 中跨可组合函数重复使用一组预览注释

    在 Jetpack Compose 中迈出第一步 这非常令人惊奇 除了一个恼人的问题 我有一组固定的预览 正常 深色和 RTL Preview name Normal group Screen showBackground true Pre
  • 从 TextView 中显示的数字中删除小数点[重复]

    这个问题在这里已经有答案了 对于我的简单计算器 我将结果显示在TextView 但它总是显示小数 我怎样才能删除它们 这是我的代码 public class MainActivity extends Activity implements
  • 在Android Studio中更改项目主题?

    我使用浅色主题创建了一些项目 现在我想将其更改为深色 但我不知道该怎么做 顺便说一句 我不是问如何在代码中做到这一点 只是问如何更改项目的默认主题 在 AndroidManifest xml 的 application 标签下 您可以设置您
  • android httprequest java.net.UnknownHostException

    我想用android发出http请求 是使用这个 void testHTTP HttpClient httpClient new DefaultHttpClient HttpUriRequest request new HttpPost h
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • Android 自定义警报对话框中的 OnClickListener

    我是一个自学成才的初学者 感谢耐心 谢谢 在 Eclipse 中 我使用自己的 xml 文件 custom dialog 创建了一个自定义警报对话框 称为 usernamealert 如果用户尚未输入用户名 即 username lengt
  • 在没有 Wifi 的情况下获取 Android 设备的 MAC 地址

    如何获取没有 Wifi 接口的 Android 设备 例如 Android 模拟器 的网络接口的 MAC 地址 通过WifiManager返回获取的WifiInfonull EDIT 更清楚地说 我必须与本地网络上的现有网络协议 不是我设计
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp

随机推荐

  • $onloaded 为新引用触发一次 AngularFire 0.5.0

    假设我们正在使用推送状态导航路线 locationProvider html5Mode true 有两条路线有两个不同的控制器 stateProvider state one url one templateUrl one html con
  • 以编程方式更改 R.string 的值?

    我正在寻找一种动态更改字符串资源值的方法 我尝试使用反射 但它声称 字段值无效 我在布局中使用字符串作为值 但需要将它们交换为不同的语言 请参阅下面所附的代码 public class Lang public static void lan
  • 执行一些代码,然后进入交互节点

    有没有办法在进入 Node js 中的交互模式之前执行一些代码 在文件中或从字符串中 并不重要 例如 如果我创建一个脚本 preamble js其中包含 console log preamble executed poor guy 和用户类
  • 使用 gradle 对嵌入 glassfish 的 jar 进行容器测试失败

    我正在使用 JUnit 和嵌入式 glassfish 来使用 CDI 测试一些代码 这看起来相当简单 但我一定错过了一些东西 我创建了一个简单的项目来演示该问题 https github com dantwinkler container
  • 如何在用户离开页面时删除文件?

    我有一个表单 其操作设置为 php 文件 verify php 在表单中 我制作了一个非常漂亮的图片上传部分 提交表单后 将打开 verify php 以验证用户填写的表单 表单值全部放置在 verify php 页面上的另一个表单内 仅将
  • Xamarin.Forms 和 Xamarin 跨平台之间的区别

    我已经使用 Xamarin 环境 2 年了 主要使用 Xamarin Forms 但是 我不知道 Xamarin 跨平台是什么 谁能提供一些结构差异 当我们谈论 Xamarin 时 本机应用程序的开发有两种方法 传统的 Xamarin 方法
  • ASP.NET Identity:授权后更新外部声明

    我将 ASP NET Identity 与多个外部登录提供程序一起使用 并且需要处理以下场景 1 用户使用外部服务登录 假设是 Facebook 应用程序从 Facebook 获取一些信息 名字和姓氏 电子邮件 出生日期等 包含此信息的声明
  • 具有相同列表的两个变量具有不同的 ID...为什么呢?

    尝试理解以下内容 为什么Python为相同的列表分配的ID不同 x 1 2 3 y 1 2 3 id x id y True id x 11428848 id y 12943768 每一个独特的object在Python中有自己的ID 它与
  • Python 中的 C# Parallel.Foreach 等效项

    我有 96 个 txt 文件需要处理 现在我正在使用 for 循环并一次执行一个 这个过程非常慢 生成的 96 个文件不需要合并 有没有办法让它们并行运行 比如 C 中的 Parallel foreach 当前代码 for src name
  • 如何在行内块元素之间添加空间?

    明确地说 我不想remove内联块元素之间的空间 我想要add it 我想要的是有一个菜单项网格 一行可以有 2 3 或 4 个项目 我希望使用媒体查询来实现 我怎样才能在我的 li 项目之间添加空间 但也有每行左右两侧无边距 填充无法解决
  • 如何显示mysql数据库的图像和描述

    我正在尝试显示图像 然后在图像下显示描述 我得到了图像显示 但我对描述感到困惑 我无法让它发挥作用 在我的代码下面显示图像和描述 Get images from the database query db gt query SELECT F
  • Mysqldump'不被识别为内部或外部命令可操作程序或批处理文件

    我一直在尝试使用任务计划程序创建批处理来备份 MySQL 数据库 FOR F tokens 1 4 DELIMS F IN date T DO set v date F G H FOR F tokens 1 4 DELIMS F IN ti
  • 错误:(35, 24) 错误:在最新的 Glide 中找不到符号方法 crossFade()

    我有一个使用 Glide 3 5 2 的旧项目 下面的工作正常 Glide with context load url override IMAGE SIZE FIX IMAGE SIZE FIX crossFade placeholder
  • Laravel:从视图调用base_controller中定义的函数

    在使用laravel框架时 如何在视图中调用base controller中定义的函数 例如 class Base Controller extends Controller public static function format so
  • 在 EC2 实例内运行的 docker 容器内运行的 Web 服务器响应非常慢

    我有一个 Web 服务器在 AWS EC2 Ubuntu 实例的 docker 容器内运行 当我向 Web 服务器发送请求时 得到响应的速度非常慢 大多数情况下 20 秒以上 尽管响应时间各不相同 但它不会超时 Web 服务器是一个非常轻量
  • iframe 中的 419 页面已过期 Laravel 页面

    我正在打开一个使用开发的页面Laravel 7在 Angular 项目的 iframe 内 页面正在显示记录 但是在创建或更新记录时 页面会抛出 419 错误 我已经更新了 same site gt none 但没有帮助 这两个项目都部署在
  • 边框半径隐藏的溢出在 Chrome 中不起作用

    不确定这是否是 chrome 特定的错误或什么 但是当我在具有边框半径隐藏溢出的父元素上转换子元素时 溢出是可见的 而转换就位 var wrapper document getElementsByClassName wrapper 0 im
  • 在 Sublime Text 3 中运行 Python 调试器 (pdb)

    如何设置 python 调试器 pdb https docs python org 2 library pdb html Sublime Text 3 中的断点 Both 崇高REPL https packagecontrol io pac
  • Rust 中涉及临时对象的销毁顺序

    在 C 中 如果错误 请纠正我 通过常量引用进行的临时绑定应该比它所绑定的表达式寿命更长 我认为 Rust 也是如此 但在两种不同的情况下我得到了两种不同的行为 考虑 struct A impl Drop for A fn drop mut
  • 同时播放多个音轨并进行同步

    最近我在 Audacity 有一个音频项目 其中有多个曲目 它有分开的人声和分开的乐器 我已将每个曲目导出为 WAV 16 位 文件 我有 5 个文件 5 个曲目 所有文件都超过300MB 长度为25分钟 我试图使用媒体播放器同时播放它们