2011-10-04 28 views
8

我正在實現從遠程機器播放流的媒體播放器。通過我的應用程序,我可以控制遠程機器(例如尋求第二個)。像魅力一樣工作,但是:Android媒體播放器緩存一些瘋狂的10-15秒(!!),這意味着每次點擊('搜索')需要10-15秒才能生效,即使它不到一秒鐘,直到新的數據到達。如何避免在播放流時在Android媒體播放器中延遲15秒/緩存

我的問題:有沒有什麼辦法來控制(限制)緩存?或者我只是做錯了什麼?我是唯一有這個問題的人嗎?

我的代碼是非常簡單的:

player = new MediaPlayer() 
player.setDataSource(url); 
player.setOnPreparedListener(new OnPreparedListener() { 

    public void onPrepared(MediaPlayer mp) { 
     mp.start(); 
    } 
}); 
player.prepareAsync(); 

更新: 我使用的是本地自建小型HTTP服務器連接我的字節流機器人會的媒體播放器。在這種情況下,似乎Android DRM正在延遲/緩存。仍然不太清楚爲什麼(爲什麼不連接到我的IIS託管文件)。也不知道如何解決這個問題。

輸入歡迎!

謝謝! Daniel

回答

1

好,同時我更接近的解決方案。原來我的問題的來源是Android DRM! (不,我不是在播放受保護的文件,它的標準mp3)。

DRM似乎已在Android 3.1中引入(我正在測試Galaxy Tab 10.1)。它在仿真器上工作正常(也許DRM沒有在那裏實現?)

任何想法我可以禁用或加速呢?似乎有一個10秒計時器在Android DRM impl的深處,等待 - 無論如何,不​​知道。我的錯誤日誌:

10-06 17:38:19.020: ERROR/MediaExtractor(226): **********MediaExtractor::Create 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(226): add uniqueid 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 1 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :ADD_UNIQUEID 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 3 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :ADD_CLIENT 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(226): Entering BpDrmManagerService::openDecryptSession 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 27 
10-06 17:38:19.020: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :OPEN_DECRYPT_SESSION_FROM_URI 
10-06 17:38:19.020: ERROR/DrmManagerService(Native)(225): Entering DrmManagerService::openDecryptSession with uri 

10 seconds wait 

10-06 17:38:29.040: ERROR/DrmManager(Native)(225): DrmManager::openDecryptSession: no capable plug-in found 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): NULL decryptHandle is returned 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): no decryptHandle is generated in service side 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): remove uniqueid 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 2 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :REMOVE_UNIQUEID 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 4 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :REMOVE_CLIENT 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(226): setDrmServiceListener 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): Entering BnDrmManagerService::onTransact with code 5 
10-06 17:38:29.040: ERROR/IDrmManagerService(Native)(225): BnDrmManagerService::onTransact :SET_DRM_SERVICE_LISTENER 
10-06 17:38:29.040: ERROR/DrmManagerService(Native)(225): Entering setDrmServiceListener 
+0

你有沒有找到這個解決方案? – ernazm

+1

沒有,我敢分享:)在一些舊的3.0 Android版本,我可以工作將\ r \ n中的HTTP響應換行符替換爲\ n \ r。是的,正考慮在那個時候回到我的CS學位:)。也許我在那裏利用了一些bug。不幸的是,沒有設備來測試它,所以我不能重現。 – Daniel

0

試試這個。這將definatly幫助你::

private class TouchandshowTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     try { 
     player.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     player.setDataSource("URL"); 
     player.prepare(); 
    } catch (Exception e) { 
     // TODO: handle exception 
    } 

     return null; 
    } 
    protected void onPostExecute(final Void unused) { 

    } 
} 

的OnCreate()

new TouchandshowTask().execute(); 
+0

不幸的是,沒有幫助。更糟糕的是,我試圖在一開始就增加傳輸速度,以便將延遲降至最低:我在一秒鐘內將第一兆字節(3分之一)轉移,並且它仍然需要超過10秒才能開始播放!不知道那裏發生了什麼,但它不覺得像緩存問題。 – Daniel

+0

我從來沒有面對這個問題,我也從服務器得到的聲音,但沒有得到任何delay.i得到50聲音,但從來沒有提出問題 –

+1

當我簡單地從服務器流文件它也適用於我。但一旦我調整到一個流有延遲... – Daniel

0

這個問題可能不只是在Android媒體播放器。 正在流式傳輸視頻的服務器應該支持需要的格式。

如果是mp4的話,你需要安裝h264-pseudo-streaming模塊(對於HLS來說是一樣的) 如果是MSS(微軟流暢的流媒體) - IIS有特殊的模塊。

此外,用戶'查找'後,意味着Native Player將發送範圍請求,這應該由服務器支持。 Nginx默認支持它們,ISS & Apache有這個問題。雖然易於配置。

0

我在較新的Android版本中意識到的一件事是,它似乎與VBR MP3文件有問題。它播放它們,但在啓動之前緩衝太多數據。 (3+ MB,我的大部分測試文件)。

解決方法是刪除MP3文件中的XING標題(這是存儲VBR信息的地方)。這似乎使播放器回落到一個更簡單的算法,並在緩衝僅100kb後成功開始播放所有文件...