【发布时间】:2013-08-15 18:37:14
【问题描述】:
似乎有几种方法可以在 Android 上播放 Ogg Vorbis 音频流,但到目前为止,我都遇到了各种问题。网上似乎并没有太多关于“正确”方法的信息。
首先我的要求:从 Ogg 文件流式传输音乐,存储在我的 res/raw 目录中。我有两个文件,intro.ogg 和 loop.ogg。前奏应该首先播放,然后是循环,然后只要音乐继续播放,就应该重复。流之间应该绝对没有差距,我想支持旧版本的 Android - 至少和 4.0 一样旧,如果可能的话,应该是 2.x。
我找到了三种方法来做到这一点:
1) 媒体播放器。最常推荐的方式。问题:要对两个流进行排队,我必须使用 setNextMediaPlayer(),它仅在 API 级别 16 中引入。此外,流之间存在一个小而明显的差距(至少在我运行 4.3 的 N4 上)。当尝试用自定义完成侦听器替换 setNextMediaPlayer() 时,我似乎也无法获得无缝播放。
2) AudioTrack、MediaExtractor 和 MediaCodec。似乎几乎是 MediaPlayer 在内部所做的。问题:仅从 API 级别 16 开始可用。此外,目前我在流之间存在小的差距。由于下面的 #3 可以无缝运行,我想我应该能够摆脱它(这里的文档似乎很薄)。
3) AudioTrack 和自定义 Ogg 解码。 jogg/jorbis JAR 可以很好地用于此目的。播放和排队是无缝的。问题:速度很慢。在我的旧 N1 上,它会导致足够的减速以轻微影响帧速率和强烈影响输入响应。
我想#1 和#2 可以利用设备可能具有的任何硬件解码支持,而#3 显然纯粹在软件中运行。在我的 N1 上播放 Ogg 流时,MediaPlayer 似乎不会导致性能问题,但由于 API 级别较低,我无法排队。
有没有办法解决这个问题?还是我坚持跳过介绍提示并尝试在旧设备的循环提示上进行粗略的淡入?
(另外,如果有人可以确认我应该能够使用 MediaExtractor 和 MediaCodec 实现真正的无缝播放,或者指出一个好的方法,那将很有帮助)
【问题讨论】: