我最近遇到了使用 Android MediaPlayer
流式传输 AAC+ radio 流的一些问题。 Regarding to the documentation , 在 Android 4.1 中应该支持流式传输 AAC+。 (测试设备是装有 Android 4.2.2 的 Nexus 2)
我发现了一些相关问题(查看 here 、 here 或 here ),但它们主要与较旧的 Android 版本或 4.1 发布之前的日期有关。我找到了 AACPlayerAndroid图书馆,但你必须在那里购买许可证..
如果我尝试流式传输 AACPlus 流,MediaPlayer 会抛出 MediaPlayerError (1,-2147483648)
,这被定义为“不受支持的媒体格式”。但是,如果我在模拟器中启动相同的 AAC+ 流,它工作正常!
到目前为止我尝试了什么:
在模拟器中尝试相同的代码有效?!? (为什么……也许本地机器支持编解码器?)
用 4.1 或 4.2 测试另外两个设备也失败了
使用手动 header 和
setDataSource(String path)
设置 AAC+ 流,这不起作用(更改 http header 也失败)设置一个新的 SimpleMediaPlayer 项目 -> 也失败了
尝试检查网络流量,如果 android 设备被重定向到错误的 url。实际上,我使用
Proxy
将设备连接到Charles
,但只能监控 Android 浏览器。我仍然认为重定向是正确的!
这是我的 Streaming.class 的 setDataSource 的实现
public AmplifyMediaPlayer(PlayerStationObject playerStationObject, Context context) {
super();
this.setAudioStreamType(AudioManager.STREAM_MUSIC);
this.mCurrentStationObject = playerStationObject;
try {
//AAC+ TestStream #1: NOT WORKING
//Uri uri = Uri.parse("http://up-gc2.webnow.com.br/alpha.aac");
//AAC+ TestStream #2: NOT WORKING
//Audio codec: 64 kbit/s 44.1 kHz AAC+, 128 kbit/s 44.1 kHz MP3
//Uri uri = Uri.parse("http://relay.publicdomainproject.org:80/jazz_swing.aac ");
//Setting HTTP header for fixing some issues with normal setDataSource Header from Android
//User-Agent "iTunes" was set to force re-direct to shoutcast streaming url
Map<String, String> headers = new HashMap<String, String>();
headers.put("User-Agent", "iTunes");
setDataSource(context, uri, headers);
//AAC Codec works fine...
//setDataSource("http://fri.net.pl:8000/fri");
prepareAsync();
//...
所以实际上我有以下问题:
为什么我无法在 Android 4.1 及更高版本上播放 ACC+ 流,即使它们应该受到支持?
有没有人有 ACC+ 流,他成功地使用 Android 的 MediaPlayer 类进行流式传输? (只是为了检查我的播放器集成是否有问题)
如果不支持 ACC+,您是否知道可以查看的好库或示例项目,他们是如何解决问题的?
谢谢或任何建议或建议!
我测试的其他 AAC+ 流:http://jam-aacp.rautemusik.fm
编辑 到目前为止,我得出的结论是:这是不可能的。 AACP-Decoder Library 是一个很好的解决方案,但它还不稳定。希望Android能尽快支持这个。如果您不同意,请发表评论!
最佳答案
我的应用遇到了同样的问题。
我玩了很多 MediaPlayer 但没有成功。我什至在应用程序内部使用代理进行了测试,该代理用于在较旧的 Android 版本上流式传输 MP3 流
我还测试了 aacplayer-android/aacdecoder-android , 但在我的测试中它不是很稳定......
我们最终得到了 BASS for Android因为我们无法找到。
但它还需要一个 AAC Patent License * 如果你想让应用程序公开(私有(private)使用我认为它不关心......)它也需要一个 BASS License除非您是非商业实体。
*) Android 应用算作消费产品而不是消费 PC 软件...只是为了避免我们在应用中犯的错误...
[更新]
为什么需要专利费?
一旦产品(在本例中为应用程序)带来了自己的解码器(或编码器),就必须支付费用,因为 BASS 和 aacdecoder-android 都带来了他们自己的解码器代码,他们需要拥有 AAC 许可证。仅当可以使用主机系统上可用的解码器(即由主机系统的开发人员许可/支付 - 在本例中为 Google)时,它才是“免费的”。但正如它seems目前无法访问/使用设备编解码器...
关于Android:AAC+ radio 流式传输不适用于 MediaPlayer(Android 4.2.2/Shoucast 链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15225076/