3

我有一个托管在服务器上的 HLS m3u8 播放列表:

#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(上下文上下文,Uri uri,地图标题)上的键值对不起作用,至少我尝试的方式是这样。以下是我从原始 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");
 }

因此,我最终得到了一个包含我的参数的 Map(即 Map'<'param, value'>'),但添加这些标题不起作用。

如果我通过播放列表 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调用自动设置这些参数?

4

2 回答 2

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");
     }

请尝试在 Log 的帮助下进行验证。

于 2014-09-08T06:50:51.517 回答
1

“?”之后的所有内容 标记不是标题,而是查询参数。

如果您不仅要为 m3u8 播放列表发送此查询参数,而且对于每个媒体片段,只有一种方法可以这样做 - 您必须在播放列表(片段 url)中硬编码此参数。

要仅通过播放列表请求发送它们,您必须将带有查询参数的 Url 设置为数据源。像这样: setDataSource(" http://myserver/playlist/336385.smil/segment1_3_av.m3u8?e=6889c9ad1087852b¶m1=value1¶m2=value2 ")

  • 您可以尝试使用 API 的重载版本setDataSource(Uri)
于 2015-02-09T13:15:43.970 回答