如何在没有任何延迟的情况下在android中循环播放音频文件?

Posted

技术标签:

【中文标题】如何在没有任何延迟的情况下在android中循环播放音频文件?【英文标题】:How to loop an audio file in android without any delay? 【发布时间】:2021-04-27 14:59:22 【问题描述】:

我已经启动了一个 android.media.MediaPlayer 文件:

mp1.start()

然后尝试循环:

setLooping(true);

但这会导致再次播放文件的延迟。

我正在尝试运行一个包含设定节奏的节奏的 mp3 文件。有没有更好的循环播放方式,这样节奏时间不会受到干扰,节奏可以无缝播放而不会出现任何卡顿/延迟?

我应该改用 SoundPool 吗?

【问题讨论】:

【参考方案1】:

针对这种特殊情况的大多数最佳做法都建议使用 .ogg 格式。您可以使用 VNC 媒体播放器轻松转换文件。

.ogg 文件格式的 Wiki - http://en.wikipedia.org/wiki/.ogg

另一个解决方案是 SoundPool,第三个解决方案是使用 Audacity 并从您的音频文件中删除安静/“空白声音”。

【讨论】:

【参考方案2】:

如果您的音频不长,请使用 SoundPool 进行低延迟媒体播放,而不是 MediaPlayer。正如其他人已经指出的那样,也将其转换为 ogg。

编辑:如果它只是一个节奏,而不是一个连续的声音,那么也许你也可以测量延迟并根据它来寻找你的音频,但我不确定这样你会得到更好的结果。

【讨论】:

【参考方案3】:

媒体播放器解决方案:

如果你坚持使用MediaPlayer,那么你可以:

    在音频文件的末尾裁剪声音,这样两个播放循环之间就没有声音间隙

    或按照here 所述自行创建自定义解决方案。

Soundpool 替代方案:

现在,根据我个人的经验,如果你想循环播放小文件,持续时间不超过1MB,那么Soundpool更方便,而且似乎没有任何相关问题与MediaPlayer相反。尝试使用 MediaPlayer 循环播放声音时有很多抱怨,因此通常首选 Soundpool 进行循环播放。

Soundpool 大小限制:

如果您担心 Sounpool 的大小限制,请记住它对每个轨道的缓冲区大小限制为 1Mb。但此限制不适用于文件大小,而是适用于解压缩的原始 PCM 数据。 SoundPool 会将加载的音频解压缩为 PCM 数据,以便立即播放,无需解码延迟。如果您正在加载的音频被大量压缩,例如 MP3,那么它可能会被放大很多。

提高性能:

此外,正如另一个答案中所建议的那样,根据许多来源,“.ogg”类型的文件总体上似乎比“.mp3”表现更好。因此,您应该尝试转换文件以获得更好的性能,但我认为您不会看到循环方面的改进。

要转换您的文件,您可以使用在线工具,例如this。如果您转换文件,请记住也要进行这些更改:

    将声音文件的采样率更改为 16000 Hz 将您的音频通道更改为单声道,而不是立体声。 确保在这些过程之后您的文件小于 1 mb。

【讨论】:

【参考方案4】:

请尝试这样做。

audio = MediaPlayer.create(this, R.raw.pl);
audio.setLooping(true);
audio.start();

【讨论】:

以上是关于如何在没有任何延迟的情况下在android中循环播放音频文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有超时/死锁的情况下在PROMELA进程中发送和接收?

如何在没有代码的情况下在 Android 上查看 React Native App 的网络流量

如何在没有循环依赖的情况下在 GraphQL 中拆分模式?

如何在没有要映射的对象数组的情况下在 React.js 中循环和渲染元素?

在没有互联网的情况下在android上获取位置坐标(纬度和经度)

是否有任何可能的方法可以在没有任何操作的情况下在互联网连接时自动关闭 android 小吃店(LENGTH_INDEFINITE)?