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、Map ヘッダー) でヘッダーをキーと値のペアとして設定しても、少なくとも私が試している方法では機能しません。元の 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");
     }

ログの助けを借りて試してみてください。

于 2014-09-08T06:50:51.517 に答える
1

「?」以降のすべて マークはヘッダーではなく、クエリ パラメータです。

このクエリ パラメータを m3u8 プレイリストだけでなく、各メディア セグメントにも送信したい場合、方法は 1 つしかありません。このパラメータをプレイリスト (セグメント URL) にハードコーディングする必要があります。

プレイリスト リクエストでのみ送信するには、データ ソースとしてクエリ パラメータを含む URL を設定する必要があります。そのように:

  • オーバーロードされたバージョンの API を使用してみることができますsetDataSource(Uri)
于 2015-02-09T13:15:43.970 に答える