在左右扬声器上播放 2 个不同的音频流

2023-11-26

一些特殊的情况迫使我做出了那种变态的事情。

是否可以在不同通道上播放 2 个不同的音频流。想象一下耳机,我需要同时在左扬声器上播放第一首歌曲,在右扬声器上同时播放第二首歌曲。

经过一些研究,我发现可以在某个单一频道上播放。甚至可以关闭其中之一。但我没有找到任何如何同时播放 2 个音频流的信息。

有可能吗?如何?一些代码示例和链接表示赞赏!


研究成果。

1)AudioTrack能够在不同的频道上播放

// only play sound on left
for(int i = 0; i < count; i += 2){
    short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
    samples[i + 0] = sample;
    samples[i + 1] = 0;
}
// only play sound on right
for(int i = 0; i < count; i += 2){
    short sample = (short)(Math.sin(2 * Math.PI * i / (44100.0 / freqHz)) * 0x7FFF);
    samples[i + 0] = 0;
    samples[i + 1] = sample;
}

2) SoundPool可以分别设置左右声道的音量。因此从技术上讲,可以启动 2 个流,并将左音量设置为 0,右音量设置为 100,第二个流则相反。正确的?

setVolume(int streamID, float leftVolume, float rightVolume)

sample:

    SoundPool pool = new SoundPool(1, AudioManager.STREAM_NOTIFICATION, 0);
pool.play(
        pool.load(this, R.raw.my_sound_effect, 1), // The sound effect to play
        0, // The volume for the left channel (0.0 - 1.0)
        1.0f, // The volume for the right channel (0.0 - 1.0)
        0, // Default priority 
        0, // Do not loop
        1.0f); // Playback rate (1.0f == normal)

也许有这样的解决方案使用MediaPlayer这样就更好了!


SOLUTION: 似乎最简单的解决方案是使用SoundPool。我测试的方式。

//SDK Version
public CustomSoundPool() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_GAME)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build();

        soundPool = new SoundPool.Builder()
                .setAudioAttributes(attributes)
                .build();
    } else {
        soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    }
    soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
            soundPool.play(sampleId, 1.0f, 0, 0, 0, 1.0f); //left channel
            //soundPool.play(sampleId, 0, 1.0f, 0, 0, 1.0f); //right channel
        }
    });
}

public void playSound(String path) {
    if (soundPool != null) {
        soundPool.load(path, 1);
    }
}

public void release(){
    if (soundPool != null) {
        soundPool.release();
    }
}

虽然缺乏像这样的功能MediaPlayer.OnCompletionListener()。现在确定如何实现这一点,但无论如何..问题解决了。


任何一种方法 1) 2) 都应该像你说的那样工作。

关于方法 1),如果您想同时播放不同的流,您可以在同一个循环中写入具有不同数据的两个通道,而无需使用两个循环。为了设置每个通道的音量,您可以使用AudioTrack的方法setStereoVolume(float leftGain, float rightGain).

Since MediaPlayer是一个高级 API,它不提供这种级别的特异性;解决方法可能是将音频数据保存到文件(将左/右声道静音)并播放作为常规媒体元素使用MediaPlayer.


UPDATE:

将音频数据保存到文件(使左/右通道静音)

为此,假设您的音频数据采用 AudioTrack 兼容格式 (PCM),您只需按照您所说的方式处理数据(通过重置数组的一部分来静音一个通道),然后将数组/缓冲区保存到WAV/PCM 格式的文件。看一看here有关如何保存 WAV 文件的更多详细信息和代码。

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

在左右扬声器上播放 2 个不同的音频流 的相关文章

随机推荐

  • 声明 CSS 规则仅适用于特定类

    我有以下 CSS 我需要仅应用于特定的 div 因为存在冲突 相关 div 的类名称为 datepicker days 我是否声明以下内容table as datepicker days table 但是我该如何声明 table下面的类 C
  • 我可以明确检查取消/终止异步计算吗?

    我有一个如下所示的异步计算 请参阅内联注释 async do Async Sleep 100 cancellation may happen during sleep but isn t checked at the end of the
  • 将 PropertyPlaceholderConfigurer 与列表结合使用

    我正在使用 PropertyPlaceholderConfigurer 从属性文件映射字符串值 它工作正常 我的问题是我是否可以在我的属性文件中设置以下内容 我的列表 A B C 然后将其映射到列表 Value myList private
  • FMA(融合乘加)指令是否始终产生与先乘后加指令相同的结果?

    我有这个程序集 AT T 语法 mulsd xmm0 xmm1 addsd xmm1 xmm2 我想将其替换为 vfmadd231sd xmm0 xmm1 xmm2 这种转换是否总是在所有涉及的寄存器和标志中留下相同的状态 或者结果浮动会略
  • 新的 create-react-app 构建上的 npm start 返回 ELIFECYCLE 错误

    使用 create react app 制作了一个新的 React 应用程序 现在运行 npm start 时在终端中出现以下错误 gt react scripts start Attempting to bind to HOST envi
  • 如何从一年中的某一天获取日期

    我正在使用一个看起来有点像这样的数据集 Year Date Day nr Value 1976 19 02 1976 50 167 1976 19 03 1976 79 140 1978 05 03 1978 64 200 1978 05
  • 如何在 ActionScript 3.0 中查找关联数组的长度?

    有没有一种简单的方法来检索关联数组的长度 实现为Object 在 ActionScript 3 0 中 据我所知 在 AS3 中创建关联数组有两种主要方法 Use a Dictionary目的 当钥匙不需要是一个时特别方便string Us
  • Android:从返回堆栈中删除所有先前的活动

    当我点击Logout按钮在我的Profile我想带用户去的活动Login页面 他需要在其中使用新的凭据 因此我使用了这段代码 Intent intent new Intent ProfileActivity this LoginActivi
  • python元组的内部结构[重复]

    这个问题在这里已经有答案了 gt gt gt a 1 gt gt gt b 1 gt gt gt id a 140472563599848 gt gt gt id b 140472563599848 gt gt gt x gt gt gt
  • 在 ShowDialog (WPF MVVM) 中将 UpdateSourceTrigger 设置为显式

    我看到了这个例子 Binding UpdateSourceTrigger 属性 在示例中 UpdateSourceTrigger 设置为 Explicit 然后在视图代码中调用 TextBox 名称的 UpdateSource 但是 如果我
  • 如何在 jQuery 中检查 AJAX 响应是否包含 HTML 内容?

    我有一个页面 其中包含一种表单 在 AJAX 调用成功时有两种可能的响应 其中之一仅返回状态代码 我需要做的是检查response任何 HTML 内容的成功回调中的对象 以便我可以将它们显示在我的页面上 我已经知道我可以访问response
  • Gacutil 与 2008 的位置

    我想运行一个在 gac 中安装 dll 的构建后脚本 但我必须使用 gacutil exe 的完整路径 我在哪里可以找到它 我有视觉工作室2008 答案是C Program Files Microsoft SDKs Windows v6 0
  • 如何在 Javascript 中将 Guid 转换为字节数组?

    我有一个服务总线 转换数据的唯一方法是通过 JavaScript 我需要将 Guid 转换为字节数组 以便随后将其转换为 Ascii85 并将其缩小为接收客户端点的 20 个字符的字符串 任何想法将不胜感激 试试这个 需要大量测试 var
  • 使用 JavaScript 事件模拟悬停

    是否可以使用 JavaScript 事件模拟悬停 我尝试在目标元素上注入鼠标悬停事件 但没有成功 例如 如果有一个带有悬停选择器的链接 是否可以使用 JavaScript 事件 悬停 在其上 基本上 我想触发 CSS 悬停 你可以假设我不会
  • 如何在NiFi中调用远程REST服务

    是否可以在NIFI处理器中使用xmlHttpRequest来调用远程休息服务 就我而言ExecuteScript处理器 使用Javascript 无法评估XMLHttpRequest 有没有类似的解决方案可以用来获取响应数据 var Out
  • 安卓应用功耗

    如何查看Android中各个应用程序的功耗 与不同的应用程序相比 至少功耗应该是相对的 并且这些应用程序可能正在使用任何服务 如 WIFI GPS LCD 唤醒锁等 android 中是否有任何与此相关的 API 可以测量使用上述资源的应用
  • ruby on Rails MVC 框架项目中的 API 调用在哪里?

    我有一个使用 mvc 框架的 Ruby on Rails 应用程序 截至目前 我在控制器中有 API 调用 但认为这不是适合它们的地方 我的所有 API 调用应该放入哪种类型的文件 谢谢 def getDetails id api resp
  • 在 C# 中使用 Unit 返回类型实现 F# 接口成员

    假设我在 F 中定义了以下接口 type IFoo lt T gt abstract member DoStuff T gt unit 如果我在 C 中实现它 我需要方法签名为 public void DoStuff
  • 状态栏上的导航抽屉半透明不起作用

    我正在开发 Android 项目 并且正在实现导航抽屉 我正在阅读新书材料设计规范和材料设计清单 规范规定 滑出窗格应浮动在包括状态栏在内的所有其他内容之上 并且在状态栏上呈半透明状态 我的导航面板位于状态栏上方 但没有任何透明度 我已经遵
  • 在左右扬声器上播放 2 个不同的音频流

    一些特殊的情况迫使我做出了那种变态的事情 是否可以在不同通道上播放 2 个不同的音频流 想象一下耳机 我需要同时在左扬声器上播放第一首歌曲 在右扬声器上同时播放第二首歌曲 经过一些研究 我发现可以在某个单一频道上播放 甚至可以关闭其中之一