2013-11-20 88 views
0

我已成功使用Media Player播放许多网址提供音频/广播流,但我已经发现了一些特殊情况,它不工作, 媒体播放器永远不会达到onPrepared。我已经用VLC测试了他们打得很好,格式正确。广播流失败在某些URL

甚至,我检查如果我在这里做了一个像这里评论的缓存http://blog.pocketjourney.com/2008/04/04/tutorial-custom-media-streaming-for-androids-mediaplayer/它的工作原理,数据下载和MediaPlayer可以播放它之后。

没玩过的网址是:

http://makrodigital.com:8014/forever?type=.mp3

http://makrodigital.com:8014/radioforevermusic?type=.mp3

代码:

private void prepareAndPlay() {  

    player = new MediaPlayer(); 
    player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    player.setOnPreparedListener(this); 
    player.setOnErrorListener(this); 
    player.setOnBufferingUpdateListener(this); 
    player.setOnInfoListener(this); 

    try { 
     player.setDataSource(getActivity().getBaseContext(),Uri.parse(getURL())); 
     player.prepareAsync(); 
    } catch (Exception e) { 
     Log.e(TAG," Setting data source " + getParam(),e); 
     buildErrorPopup(); 
     return; 
    } 
} 

    // In the problematic URLs it is never called 
@Override 
public void onPrepared(MediaPlayer mp) { 
    try { 
     mp.start(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

如果ALSA有测试此没有运气:

//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"); 
player.setDataSource(getActivity().getBaseContext(), Uri.parse(getParam()), headers); 

的问题是,这是没有办法使用的MediaPlayer直接播放这个网址,以避免工具的复杂性,在所有可能的escenarios工作的缓存?

如果看到有低水平媒体API这里,Best practices for audio streaming

+0

检查logcat是否有任何可能指示什么是通过OnErrorListener和OnInfoListener实现出错。 – petey

+0

避免使用'e.printStackTrace();'在机器人的项目,而是使用了Android SDK提供日志类[LOG](http://developer.android.com/reference/android/util/Log.html)...像'Log.e( “TAG”,e.getMessage(),E);' – petey

+0

@petey,我已经确认并没有错误报道没有任何更多信息。它正在等待开始。关于.printStackTrace(),你是对的,我避开它们,它是自动生成的测试代码。 –

回答

0

我注意到这个问题已很旧,但仍然没有答案。您的MediaPlayer对象的onPrepared()方法永远不会被调用,因为数据源很糟糕,无法准备。有时,流式广播电台链接出于任何原因都处于脱机状态,这不是代码的错误。如果一个链接不好,那就很糟糕,这就是全部。设置一个onErrorListener()来观察这一点,并通过让用户知道存在问题并继续处理您的代码(即播放下一个链接或退出)来处理错误。