android - opensl中的音频播放器可以输出到两个数据接收器吗?

标签 android audio android-ndk opensl

有没有办法让音频播放器输出到两个数据接收器?

更具体地说,我正在尝试使用音频播放器将 mp3 从网络流式传输到缓冲区和输出混合,并将数据源设置为 uri。现在我将音频播放器的接收器设置为仅输出混合,因此我可以流式传输此文件并在预取表示有足够数据时播放它,但我也想同时将此流式数据放入缓冲区中时间。

最佳答案

答案是否定的,但有一种方法可以解决这个问题。

我没有意识到,当您创建一个音频播放器并输出到一个缓冲区队列,以及一个作为 uri 的接收器时,它会像获取数据一样快地播放到缓冲区。

因此,当我意识到发生了这种情况时,我创建了另一个音频播放器,它有一个缓冲区队列作为源,输出混合作为接收器。

一切设置完毕后,我暂停第一个音频播放器 (uriPlayer),它开始“下载”并将数据流式传输到缓冲区。当 uriPlayer 的预取表示有足够的​​数据时,我检查 uriPlayer 的“持续时间”以找出歌曲的长度,然后我创建一个足够大的缓冲区,以根据持续时间和样本保存来自 uriPlayer 的 pcm 数据速率(和输出 channel ,立体声为 2 个,单声道为 1 个)。

我将此缓冲区放入 uriPlayers 接收缓冲区队列中,然后将 uriPlayers 状态设置为 Play,因此它开始将所有数据加载到其缓冲区队列中的缓冲区中。

然后,我将同一个缓冲区排入第二个播放器 (musicPlayer) 源缓冲区,并将其状态设置为 Play,这将开始在其缓冲区队列中播放该缓冲区。

只要 uriPlayer 下载音乐文件内容的速度比音乐播放器从缓冲区播放的速度快,只需从 uriPlayer 调用 getPosition 即可找出歌曲当前正在播放的位置以及是否“领先” musicPlayer 当前正在播放的位置,一切正常!如果下载速度变慢或太慢,只需暂停 musicPlayer(如果它领先于 uriPlayer)。

关于android - opensl中的音频播放器可以输出到两个数据接收器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14394457/

相关文章:

Android 应用程序调用谷歌地图与汽车、公共(public)、步行控制

C# 音频库(具有简单的效果、回声、混响...)

c# - 添加声音过滤器并连接声音针脚

gradle - Android Studio Gradle 构建 : NDK error

java - 如何通过 JNI 创建 HashMap<String, String> 然后解析为 java

android-ndk - 使用Android NDK编译依赖于其他 native 库运行的 native 库?

android - 我无法在 Eclipse 中访问 Crouton 库

android - 使用 FLAG_NO_LIMIT 后 SnackBar 落后于 NavigationBar

android - 如何找出broadcastReceiver调用的地方?

python - 如何编写多频音频文件?