2013-11-20 87 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()來觀察這一點,並通過讓用戶知道存在問題並繼續處理您的代碼(即播放下一個鏈接或退出)來處理錯誤。