2010-07-28 40 views
0

我的第一篇文章在這裏。感謝大家,本網站對於學習Android編程非常有用。設置數據源後Stagefright媒體在2.2中延遲?

我有一個簡單的應用程序,加載一個MP3流並播放它。它在1.6和2.1上工作正常,但在2.2上它不太正確。看起來我的服務開始出現問題,它給了我一個ANR以及我必須點擊「等待」的對話框,然後服務開始。爲什麼服務需要很長時間才能啓動?

這裏是我的簡單的代碼,設置源和播放音頻:

public class MyActivityService extends Service { 

MediaPlayer player = new MediaPlayer(); 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 
@Override 
public void onCreate() { 
    super.onCreate(); 

    try { 

    player.setDataSource("URL OF MUSIC FILE"); 
    } catch (IllegalArgumentException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IllegalStateException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    try { 

    player.prepare(); 
    player.setVolume(1, 1); 
     player.setLooping(true);   
     player.start();     

    Toast.makeText(getApplicationContext(), "Audio Service Started.", Toast.LENGTH_SHORT).show();} 

附錄:

原來這不是沒有開始我的服務,它是不是很快啓動音頻足夠在2.2 ...

當我的服務開始和停止時,我擺脫了ANRs,將我的服務的onCreate()onDestroy()方法放在他們自己的線程中,這可能是從一開始它應該如何?對不起,只是學習。

但是,這是真正的問題延遲仍然存在,澄清 -

例如,我的代碼,因爲它是現在,工作非常愉快,只是我多麼希望它在2.1和2.2,當我數據源設置爲這樣一個MP3文件:http://dl.dropbox.com/u/6916184/TestSongStream.mp3

,但是當我的數據源設置爲音頻流的位置是這樣的:http://d.liveatc.net/kjfk_twr或這樣的:http://relay.radioreference.com:80/192236577它正常工作只在2.1。

在2.2的聲音也開始播放最後,但它需要「StagefrightPlayer」約25秒左右,如下所示,直到聲音開始設置數據源後:

07-31 02:54:30.176: INFO/StagefrightPlayer(34): setDataSource('http://relay.radioreference.com:80/192236577') 
07-31 02:54:55.228: INFO/AwesomePlayer(34): calling prefetcher->prepare() 
07-31 02:54:56.231: INFO/Prefetcher(34): [0x2cc28] cache below low water mark, filling cache. 
07-31 02:54:56.337: INFO/AwesomePlayer(34): prefetcher is done preparing 
07-31 02:54:56.347: DEBUG/AudioSink(34): bufferCount (4) is too small and increased to 12 
07-31 02:54:57.337: ERROR/AwesomePlayer(34): Not sending buffering status because duration is unknown. 

它也需要相同數量時間大約25秒,在我的服務的onDestroy()方法中調用player.stop()後停止媒體播放器,並且onDestroy()方法繼續Toast消息並取消通知。

這只是它與2.2的方式嗎?如果是這樣,我可以解決延遲問題,這不是問題。或者更可能是我做錯了什麼?但它在1.6和2.1中完全符合我的需求!

會發布更多的代碼幫助嗎?

我的代碼很簡單。沒有音頻控制或類似的東西。只需一個開始音頻按鈕和停止音頻按鈕,即可開始和停止播放音頻流的服務。

謝謝你的幫助!

+0

更新:我發現這個問題與我嘗試播放的特定音頻流有關。我嘗試了不同的流,它發揮得很好。什麼類型的音頻流可以在1.6和2.1中播放,但不在2.2中播放?我知道這是因爲在2.2媒體框架是不同的。如果沒有服務超時,我仍然需要能夠播放不工作的數據流!我應該嘗試什麼?謝謝你的幫助。 – ShadowGod 2010-07-29 07:18:55

+0

請忽略我上面的更新評論,並參閱我原始問題中的附錄我想我已澄清了真正的問題。謝謝。 – ShadowGod 2010-07-31 08:27:15

+0

我在我的應用程序中擊中了同樣的東西,@ShadowGod是否能夠爲此提出任何解決方案? – 2011-11-23 04:23:59

回答

1

不要從主應用程序線程調用prepare(),特別是流,因爲這可能比ANR之前允許的時間長得多。改爲使用prepareAsync()。我不知道這是否是您特定問題的根源,但它肯定會成爲您當前實施中ANR的一個原因。

+0

謝謝我修復了ANR,你能看到我的附錄嗎?有什麼想法嗎? – ShadowGod 2010-07-31 08:30:04

+0

@ShadowGod:對不起,但我對你的問題沒有更多的想法。 – CommonsWare 2010-08-01 08:50:49

+0

好的謝謝你看我欣賞它。 – ShadowGod 2010-08-01 18:42:08