2013-07-24 26 views
2

我有一個託管服務器上的HLS M3U8播放列表:Android的HLS播放:傳遞URL參數,如Mediaplayer.setDataSource()頭不能正常工作

#EXTM3U 
#EXT-X-TARGETDURATION:10 
#EXT-X-ALLOW-CACHE:YES 
#EXT-X-KEY:METHOD=AES-128,URI="https://myserver/playlist/336385.smil/crypt.key?e=6889c9ad1087852" 
#EXT-X-VERSION:2 
#EXT-X-MEDIA-SEQUENCE:1 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment1_3_av.ts?e=6889c9ad1087852b 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment2_3_av.ts?e=6889c9ad1087852b 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment3_3_av.ts?e=6889c9ad1087852b 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment4_3_av.ts?e=6889c9ad1087852b 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment5_3_av.ts?e=6889c9ad1087852b 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment6_3_av.ts?e=6889c9ad1087852b 
#EXT-X-ENDLIST 

但也有檢索需要額外的URL參數播放列表,即調用將是這樣的:

http://myserver/playlist/336385.smil/segment1_3_av.ts?e=6889c9ad1087852b&param1=value1&param2=value2 

設置標頭,在setDataSource (Context context, Uri uri, Map headers)鍵值對不工作,至少我想它的方式。下面是我如何創建一個從原始URL參數標題:

String paramString =playlistUrl.substring(playlistUrl.indexOf("?") + 1); 

String paramsSplit[] = paramString.split("&"); 
HashMap<String, String> headers = new HashMap<String, String>(); 

for(int i= 0;i<paramsSplit.length;i++) 
{ 
    String key = paramsSplit[i].substring(0, playlistUrl.indexOf("=")); 
    String value = paramsSplit[i].substring(playlistUrl.indexOf("=")+1, playlistUrl.length()); 
    headers.put(key, value);//e.g headers.put("param1", "value1"); 
} 

因此我結束了我在它的參數(即地圖「<‘PARAM,價值’>」)一個地圖,但添加這些報頭不起作用。

,如果我去通過播放M3U8本身並修訂與結束自己多餘的參數每一個URL調用,所以播放列表如下:

#EXTM3U 
#EXT-X-TARGETDURATION:10 
#EXT-X-ALLOW-CACHE:YES 
#EXT-X-KEY:METHOD=AES-128,URI="https://myserver/playlist/336385.smil/crypt.key?e=6889c9ad1087852b&param1=value1&param2=value2" 
#EXT-X-VERSION:2 
#EXT-X-MEDIA-SEQUENCE:1 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment1_3_av.ts?e=6889c9ad1087852b&param1=value1&param2=value2 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment2_3_av.ts?e=6889c9ad1087852b&param1=value1&param2=value2 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment3_3_av.ts?e=6889c9ad1087852b&param1=value1&param2=value2 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment4_3_av.ts?e=6889c9ad1087852b&param1=value1&param2=value2 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment5_3_av.ts?e=6889c9ad1087852b&param1=value1&param2=value2 
#EXTINF:10, 
http://myserver/playlist/336385.smil/segment6_3_av.ts?e=6889c9ad1087852b&param1=value1&param2=value2 
#EXT-X-ENDLIST 

播放列表中正常工作,併發揮沒有問題!顯然,手動修改m3u8並不理想,有沒有一種方法可以自動爲url調用設置這些參數?

回答

1

回答已經太遲了。但是可能對你有所幫助。我沒有測試,但問題在於你的編碼方式。特別是在以下幾行中。

for(int i= 0;i<paramsSplit.length;i++) 
{ 
    String key = paramsSplit[i].substring(0, playlistUrl.indexOf("=")); 
    String value = paramsSplit[i].substring(playlistUrl.indexOf("=")+1, playlistUrl.length()); 
    headers.put(key, value);//e.g headers.put("param1", "value1"); 
} 

它可能是這樣的

for(int i= 0;i<paramsSplit.length;i++) 
    { 
     String key = paramsSplit[i].substring(0, paramsSplit[i].indexOf("=")); 
     String value = paramsSplit[i].substring(paramsSplit[i].indexOf("=")+1, paramsSplit[i].length()); 
     headers.put(key, value);//e.g headers.put("param1", "value1"); 
    } 

請試着和登錄的幫助覈實。

1

「?」後的所有內容標記不是標題,而是查詢參數。

如果您想發送此查詢params不僅適用於m3u8播放列表,但對於每個媒體段只有一種方法可以這麼做 - 您必須在播放列表(段url)中對此參數進行硬編碼。

要僅通過播放列表請求發送它們,您必須將查詢參數自身設置爲數據源的Url。這樣的: 的setDataSource( 「http://myserver/playlist/336385.smil/segment1_3_av.m3u8?e=6889c9ad1087852b&param1=value1&param2=value2」)

  • ,你可以嘗試使用API​​的重載版本setDataSource(Uri)