2016-10-01 115 views
0

我在android中使用MediaPlayer來流式傳輸通過ListView添加的幾個音頻文件。從ListView單擊項目時播放音頻。MediaPlayer:音頻將不會從開始流

流很長(35分鐘+),並且如果用戶在流結束之前退出應用程序。然後,在啓動後從ListView中再次選擇該項目時,該流將從與之相同的地方恢復,而我希望從ListView中選擇該項目時從頭開始。

下面的代碼:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    musicService.player.reset(); 
    musicService.player.release(); 
    musicService.player = new MediaPlayer(); 

    try { 
     musicService.player.setDataSource(skURL[position]); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    musicService.player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    musicService.player.prepareAsync(); 
    musicService.player.setOnPreparedListener(this); 
} 

@Override 
public void onPrepared(MediaPlayer mp) { 
    musicService.playSK(); 
} 

//In the MusicService.java 

public void playSK(){ 
    player.start(); 
} 

我試圖尋找位置設置爲0的playSK()方法以爲這樣就可以解決這個問題就像

public void playSK(){ 
    player.seekTo(0); 
    player.start(); 
} 

而且部分做了。當選擇ListView的第一個項目,則該流總是從頭開始,但點擊任何其他項目提供了以下錯誤:

MediaPlayer : error (-2147483648, 0) 
MediaPlayer : start called in state 0 
MediaPlayer : error (-38, 0) 
MediaPlayer : Error (-2147483648, 0) 
MediaPlayer : Error (-38, 0) 

更新:

所以我決定鑽進去,爲什麼有試圖尋找曲目開始時引起的問題,我發現由於協議例外,mediaplayer無法獲得持續時間。

10-01 17:35:06.065 10031-10031/project D/LOG: data source set 
10-01 17:35:06.065 10031-10031/project D/LOG: preparing media player 
10-01 17:35:06.067 10031-10066/project D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= stagefright/1.2 (Linux;Android 6.0.1) 
10-01 17:35:06.070 10031-10031/project D/MediaPlayer: setSubtitleAnchor in MediaPlayer 
10-01 17:35:06.073 10031-10031/porject D/LOG: media player prepared 
10-01 17:35:06.074 10031-10066/project D/MediaHTTPConnection: proxy null port 0 
10-01 17:35:06.171 10031-10066/project W/MediaHTTPConnection: readAt 12648448/32768 => java.net.ProtocolException 
10-01 17:43:43.352 21618-21618/project D/LOG: seeking to start 
10-01 17:43:43.352 21618-21618/project W/MediaPlayer: Stream has no duration and is therefore not seekable. 

如何處理此異常並解決問題?

+0

重點關注MP對象的各種狀態。國際海事組織如果你有正確的軌道加載和播放器處於正確的狀態,你應該有一個NP調用seek() –

+0

更新:我該如何處理ProtocolException? – Devansh

+0

如果你不熟悉ffmpeg,試着將媒體上傳到youtube,然後從youtube下載並重新嘗試在下載的版本上尋找..這可能是好的,因爲utube remux'd它與原子 –

回答

0

嘗試使媒體播放器對象爲空之後musicService.player.release();

musicService.player = null; 

我也遇到過這個問題,唯一的解決方法是適合我的是使它爲空。如果您仍然遇到任何問題,請讓我知道

+0

做到了,沒有幫助。 – Devansh

+0

在onPrepared方法中,您應該使用在參數 –

+0

中給出的那個對象,這也沒有幫助。是否有可能以某種方式緩存歌曲在URL中到達的持續時間,然後簡單地將緩存的持續時間傳遞給'player.setDataSource'方法?因爲當我反覆按下該項目時,它會向前跳3-4秒,然後有時會從頭開始隨機開始。所以它很可能會跳過,因爲它已經緩衝並將數據存儲在某個臨時文件中,並且當它用完緩衝數據時,它會跳到曲目的開頭.... – Devansh