在 Android 上正确同步同时播放两个不同的流(文件)

Posted

技术标签:

【中文标题】在 Android 上正确同步同时播放两个不同的流(文件)【英文标题】:Playing two different streams (files) simultaneously with proper sync on Android 【发布时间】:2018-10-16 17:06:56 【问题描述】:

我正在使用两个mediaPlayer 实例向每个通道发送两个不同的流。有一半的时间,它工作得很好,但有时左右声道之间有延迟,可以清楚地听到。除了android中的soundpool之外,还有其他选择可以同步播放多个音频文件吗? soundpool 不适合我的应用程序,因为音频文件很大(每个大约 20 MiB)。有问题的音频文件格式是:FLAC。

【问题讨论】:

认为您可能需要自己解码 FLAC(MediaCodec 可以做到),并将两个流混合成一个 AudioTrack。 @greeble31:我最终按照你的建议去做,而且工作起来就像一个魅力。谢谢。 【参考方案1】:

我发现 Android API 没有提供适当的内置混合功能。我最终使用 wav 文件而不是 FLAC 并根据需要动态混合它们。这是我如何实现它的更高级别的描述。

Read both wav files and saving data part in byte array (Don't forget to strip out header bytes)

Mix them byte by byte to generate a unified wav file

在我的用例中,我只需要混合左右声道,但可以根据需要进行各种转换。

Create a temporary file to hold mixed data

Play the temporary file with mediaPlayer

也可以使用audioTrack 来播放而不将结果字节数组存储到临时文件中,但由于内置的​​ seekTo 功能,我选择使用mediaPlayer

希望,这种方法会有所帮助。

【讨论】:

以上是关于在 Android 上正确同步同时播放两个不同的流(文件)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 上同时播放两个不同的歌曲文件?

如何在 Android 上异步和同时(复音)播放声音?

同时播放多个 SoundPool

两个不同的音源可不可以同时放入一台功放播放?

在附近的 iOS 设备上同步播放音乐时,音乐没有同时播放(多点连接)

如何播放来自两个不同来源的音频和视频?