我最近遇到了一些使用Android MediaPlayer
流式传输AAC + 广播流的问题。 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 + Stream,它工作正常!
到目前为止我尝试了什么:
在模拟器中尝试相同的代码有效吗?!? (为什么......本地机器可能支持编解码器?)
使用4.1或4.2测试另外两台设备也失败了
使用手动标头和setDataSource(String path)
设置AAC +流,但不起作用(更改http标头也失败)
设置一个新的SimpleMediaPlayer项目 - >也失败了
尝试检查网络流量,如果Android设备被重定向到错误的网址。实际上,我使用Charles
将设备与Proxy
连接,但只能监控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 + Stream,即使它们应该受到支持?
有没有人有ACC + Stream,他成功使用Android的MediaPlayer类进行流式传输? (只是为了检查,如果我的播放器集成有什么东西)
如果不支持ACC +,您是否知道一个好的图书馆或示例项目,他们如何解决这个问题?
谢谢或任何建议或建议!
我测试过的其他AAC + Streams:http://jam-aacp.rautemusik.fm
修改 到目前为止,我最终得出结论:这是不可能的。 AACP解码器库是一个很好的解决方案,但它还不稳定。希望Android能尽快支持这一点。如果您不同意,请提出意见!
答案 0 :(得分:3)
我的应用程序遇到了同样的问题。
我在MediaPlayer上玩了很多但没有成功。我甚至在app中使用代理进行了测试,该代理用于在旧版Android上播放MP3 Streams
我还测试了aacplayer-android / aacdecoder-android,但在我的测试中它不是很稳定......
我们最终找不到BASS for Android,因为我们无法找到。
但是如果你想让应用程序公开,那么它还需要一个AAC Patent License *(供私人使用,我认为它并不关心......)除非你是非人,否则它需要一个BASS License - 商业实体。
*)Android应用程序算作消费者产品而不是消费者PC软件 ...只是为了避免我们为应用程序犯下的错误......
<强> [UPDATE] 强>
为什么需要专利费?
一旦产品(在这种情况下是App)带来的是自己的解码器(或编码器),BASS和aacdecoder-android带来他们自己的解码器代码,他们必须支付费用,他们需要有AAC许可证。只有当可以使用主机系统上可用的解码器(由主机系统的开发者许可/支付 - 在这种情况下是Google)时,它才是“免费的”。但是因为它seems目前无法访问/使用设备编解码器......
答案 1 :(得分:0)
如果您可以将Nexus 2与USB连接并运行adb shell
并获取终端,则可以使用stagefright
检查所支持的可用编解码器和配置文件。
例如stagefright -l
和stagefright -p
将是两个有用的命令。
答案 2 :(得分:0)
我也调查了这一点,我发现如果你包含你自己的解码器,就必须支付许可费用:
“如果您将利用Android中的原生AAC支持,那么 您的应用程序不包含AAC编码器或解码器,那么您就不会 有许可证的需要/义务 - 您的产品不会 侵犯“。
这意味着您可以在没有版税的情况下玩AAC的唯一方法是本机Android播放器支持AAC及其内置解码器。根据事物的外观,4上没有对此的支持。我尝试向播放器提供AAC流,它只是永久缓冲。