如何在Expo-av中同步播放多个音频文件?

问题描述 投票:0回答:1

在我的应用程序中,用户录制自己在背景音乐中唱歌的声音,然后同时播放录制的音频和该背景音乐。我的音频系统使用 expo-av。问题在于,在播放阶段,音频经常不同步,因为 expo 仅真正支持异步音频。有人对如何从高层次解决这个问题有什么建议吗?

我的一些想法:

  1. 将两个音频文件混合成一个文件进行播放。除了录音和背景音轨也不同步之外,这几乎是有效的。如果我确切地知道它们偏移了多少,我可以在混音时将一定量的静音添加到其中一个文件中。但是,我还没有找到准确计算这个偏移量的方法。
  2. 减少录制和播放开始所需的时间,使延迟不明显。我发现这里有帮助的一些事情是以较低质量录制并使用较小的音频文件。如果有任何其他提示,我们将不胜感激。
  3. 使用与 expo-av 不同的音频库。有没有想到更好地支持同步音频的?理想情况下,Expo 或至少 React Native 也支持它。
react-native audio expo expo-av
1个回答
0
投票

可能为时已晚,但我对这个问题有一些建议。尽管我的解决方案并不完美,并且我仍在寻找答案,但这是我尝试过的:

通常,你可以写:

await sound1.playAsync();
await sound2.playAsync();

但是,await 语句可能会导致这些调用按顺序运行,这可能会导致它们不同步。相反,您可以删除await 语句以允许两行几乎同时执行:

sound1.playAsync();
sound2.playAsync();

这种方法确保两种声音同时开始播放过程,尽管它们仍然需要一些时间才能开始。

此外,您应该在播放声音之前预加载它们:

const sound = new Audio.Sound();
await sound.loadAsync(require("path/to/sound/.mp3"));

确保声音已加载,然后无需等待即可播放:

sound1.playAsync();
sound2.playAsync();

另一种尝试方法是使用 Promise.all:

Promise.all([sound1.playAsync(), sound2.playAsync()]);

这有助于确保两种声音尽可能同时播放。

我仍在寻找更好的解决方案,但这些提示可能会有所帮助:播放声音时避免等待并确保它们已预加载。希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.