在Android上流式传输Ogg Vorbis的最佳方式

时间:2013-08-13 23:45:45

标签: android ogg vorbis

似乎有几种方法可以在Android上播放Ogg Vorbis音频流,但到目前为止,我遇到了各种各样的问题。网上似乎没有太多关于“正确”方式的信息。

首先我的要求:从Ogg文件中流式传输音乐,存储在我的res / raw目录中。我有两个文件,intro.ogg和loop.ogg。介绍应首先播放,然后循环播放,只要音乐继续播放,就应该重复播放。流之间应该没有任何差距,我想支持旧版本的Android - 至少可以使用旧版本,或者尽可能使用2.x.

我找到了三种方法:

1)MediaPlayer。最常推荐的方式。问题:要排队两个流,我必须使用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实现真正的无间隙播放,或者指向一个好的指南,那将会有所帮助)

1 个答案:

答案 0 :(得分:0)

我的建议是使用NDK来获取本机运行的vorbis解码器(可能是Tremor),然后从你的应用程序中使用那个MUCH FASTER原生解码器,而不是使用速度慢得多的jogg / jorbis java解码器。 (它可能至少比java解码器快一个数量级)

然后,您可以使用AudioTrack类获取本机解码的PCM并将其写入音频设备。

如果有人还没有这样做,我会感到惊讶,所以首先谷歌吧!