【问题标题】:Best way to stream Ogg Vorbis on Android在 Android 上流式传输 Ogg Vorbis 的最佳方式
【发布时间】: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 实现真正的无缝播放,或者指出一个好的方法,那将很有帮助)

【问题讨论】:

    标签: android ogg vorbis


    【解决方案1】:

    我的建议是使用 NDK 让 vorbis 解码器在本地运行(可能是 Tremor),然后从您的应用程序中使用更快的本地解码器,而不是使用慢得多的 jogg/jorbis java 解码器。 (大概会比java解码器快至少一个数量级)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 2011-02-03
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多