こんにちは、マルチメディアサポートチームです。 今回の記事で、英文となっている以下の記事を日本語で補足説明したいと思います。
How to make Token authorized AES encrypted HLS stream working in Safari
Safari で HLS+AES (Token ありの場合) の再生を行うために、プレイヤーがキー リクエストを行う際に、Token を取り入れる必要があります。Safari の Native Player がこちらの処理を行うことに対応していないため、Token ありのキー リクエストをするために、記事で紹介されているような方法 (キーリクエストのマニフェストに Token を適切に付加するProxy 機能を持つサーバーを間に置く) を実施します。
以下に記事の補足説明と、一例のマニフェストをどこで書き換えているかの追加説明をしていきます。Token ありの AES ですので、お客様の認証システムをすでにお持ちである前提です。そして、Proxy サーバーを新しく構築いただく必要があります。
記事にて紹介されていますステップをまとめますと以下になります。
1. マニフェスト (Top Playlist) のリクエスト
2. (1) の応答として Top Playlist の情報を取得
3. “2nd Level のマニフェスト” のリクエスト
4. “2nd Level のマニフェスト” を取得 (これには キーサーバーのURLと キーID, Token が含まれます)
5. キー取得のために、キー サーバーに “2nd Level のマニフェスト” のキーをリクエスト (Token 付き)
6. (5) の応答として キー を取得し、再生が可能になる。
記事には記載されており既にご確認されていると存じますが、サンプルコードが Github に提供してあります。
https://github.com/AzureMediaServicesSamples/AESHLSSafari
2. 一例のマニフェストをどこで書き換えているかを追加説明
———————————————————————
Azure Media Services から配信される URL は以下の通りとします。
ステップ 3 のマニフェストの内容:(上記の URL を IE 等で開くと、ファイルがダウンロードされ Text Editor で開くと確認できます)
*************************
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=”audio”,NAME=”AAC_und_ch2_128kbps”,URI=”QualityLevels(125423)/Manifest(AAC_und_ch2_128kbps,format=m3u8-aapl)”
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=”audio”,NAME=”AAC_und_ch2_56kbps”,DEFAULT=YES,URI=”QualityLevels(53634)/Manifest(AAC_und_ch2_56kbps,format=m3u8-aapl)”
#EXT-X-STREAM-INF:BANDWIDTH=542987,RESOLUTION=320×180,CODECS=”avc1.64000d,mp4a.40.2″,AUDIO=”audio”
QualityLevels(389908)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=542987,RESOLUTION=320×180,CODECS=”avc1.64000d”,URI=”QualityLevels(389908)/Manifest(video,format=m3u8-aapl,type=keyframes)”
#EXT-X-STREAM-INF:BANDWIDTH=797524,RESOLUTION=640×360,CODECS=”avc1.64001e,mp4a.40.2″,AUDIO=”audio”
QualityLevels(638965)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=797524,RESOLUTION=640×360,CODECS=”avc1.64001e”,URI=”QualityLevels(638965)/Manifest(video,format=m3u8-aapl,type=keyframes)”
#EXT-X-STREAM-INF:BANDWIDTH=1145551,RESOLUTION=640×360,CODECS=”avc1.64001e,mp4a.40.2″,AUDIO=”audio”
QualityLevels(979500)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1145551,RESOLUTION=640×360,CODECS=”avc1.64001e”,URI=”QualityLevels(979500)/Manifest(video,format=m3u8-aapl,type=keyframes)”
#EXT-X-STREAM-INF:BANDWIDTH=1649597,RESOLUTION=960×540,CODECS=”avc1.64001f,mp4a.40.2″,AUDIO=”audio”
QualityLevels(1472696)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1649597,RESOLUTION=960×540,CODECS=”avc1.64001f”,URI=”QualityLevels(1472696)/Manifest(video,format=m3u8-aapl,type=keyframes)”
#EXT-X-STREAM-INF:BANDWIDTH=2392319,RESOLUTION=960×540,CODECS=”avc1.64001f,mp4a.40.2″,AUDIO=”audio”
QualityLevels(2199430)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=2392319,RESOLUTION=960×540,CODECS=”avc1.64001f”,URI=”QualityLevels(2199430)/Manifest(video,format=m3u8-aapl,type=keyframes)”
#EXT-X-STREAM-INF:BANDWIDTH=3548160,RESOLUTION=1280×720,CODECS=”avc1.64001f,mp4a.40.2″,AUDIO=”audio”
QualityLevels(3330390)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3548160,RESOLUTION=1280×720,CODECS=”avc1.64001f”,URI=”QualityLevels(3330390)/Manifest(video,format=m3u8-aapl,type=keyframes)”
#EXT-X-STREAM-INF:BANDWIDTH=4859041,RESOLUTION=1920×1080,CODECS=”avc1.640028,mp4a.40.2″,AUDIO=”audio”
QualityLevels(4613052)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=4859041,RESOLUTION=1920×1080,CODECS=”avc1.640028″,URI=”QualityLevels(4613052)/Manifest(video,format=m3u8-aapl,type=keyframes)”
#EXT-X-STREAM-INF:BANDWIDTH=6134366,RESOLUTION=1920×1080,CODECS=”avc1.640028,mp4a.40.2″,AUDIO=”audio”
QualityLevels(5860924)/Manifest(video,format=m3u8-aapl)
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=6134366,RESOLUTION=1920×1080,CODECS=”avc1.640028″,URI=”QualityLevels(5860924)/Manifest(video,format=m3u8-aapl,type=keyframes)”
#EXT-X-STREAM-INF:BANDWIDTH=62973,CODECS=”mp4a.40.2″,AUDIO=”audio”
QualityLevels(53634)/Manifest(AAC_und_ch2_56kbps,format=m3u8-aapl)
*************************
ステップ 4 で Player に返ってくる編集された Top Playlist のマニフェストは以下でございます。
ステップ 4 で応答されるマニフェスト:
その内容は以下の通りでございます。(上記の URL を IE 等で開くと、ファイルがダウンロードされ Text Editor で開くと確認できます)
*************************
#EXTM3U
#EXT-X-VERSION:4
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=”audio”,NAME=”AAC_und_ch2_128kbps”,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(125423)/Manifest(AAC_und_ch2_128kbps,format=m3u8-aapl)&token=<省略>“
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=”audio”,NAME=”AAC_und_ch2_56kbps”,DEFAULT=YES,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(53634)/Manifest(AAC_und_ch2_56kbps,format=m3u8-aapl)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=542987,RESOLUTION=320×180,CODECS=”avc1.64000d,mp4a.40.2″,AUDIO=”audio”
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=542987,RESOLUTION=320×180,CODECS=”avc1.64000d”,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(389908)/Manifest(video,format=m3u8-aapl,type=keyframes)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=797524,RESOLUTION=640×360,CODECS=”avc1.64001e,mp4a.40.2″,AUDIO=”audio”
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=797524,RESOLUTION=640×360,CODECS=”avc1.64001e”,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(638965)/Manifest(video,format=m3u8-aapl,type=keyframes)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=1145551,RESOLUTION=640×360,CODECS=”avc1.64001e,mp4a.40.2″,AUDIO=”audio”
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1145551,RESOLUTION=640×360,CODECS=”avc1.64001e”,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(979500)/Manifest(video,format=m3u8-aapl,type=keyframes)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=1649597,RESOLUTION=960×540,CODECS=”avc1.64001f,mp4a.40.2″,AUDIO=”audio”
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=1649597,RESOLUTION=960×540,CODECS=”avc1.64001f”,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(1472696)/Manifest(video,format=m3u8-aapl,type=keyframes)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=2392319,RESOLUTION=960×540,CODECS=”avc1.64001f,mp4a.40.2″,AUDIO=”audio”
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=2392319,RESOLUTION=960×540,CODECS=”avc1.64001f”,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(2199430)/Manifest(video,format=m3u8-aapl,type=keyframes)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=3548160,RESOLUTION=1280×720,CODECS=”avc1.64001f,mp4a.40.2″,AUDIO=”audio”
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=3548160,RESOLUTION=1280×720,CODECS=”avc1.64001f”,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(3330390)/Manifest(video,format=m3u8-aapl,type=keyframes)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=4859041,RESOLUTION=1920×1080,CODECS=”avc1.640028,mp4a.40.2″,AUDIO=”audio”
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=4859041,RESOLUTION=1920×1080,CODECS=”avc1.640028″,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(4613052)/Manifest(video,format=m3u8-aapl,type=keyframes)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=6134366,RESOLUTION=1920×1080,CODECS=”avc1.640028,mp4a.40.2″,AUDIO=”audio”
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=6134366,RESOLUTION=1920×1080,CODECS=”avc1.640028″,URI=”http://benlamhlsproxy.azurewebsites.net/api/ManifestProxy?playbackUrl=http%3a%2f%2famssamples.streaming.mediaservices.windows.net%2f9ead18f1-29f8-453c-8721-4becc00ff611%2fBigBuckBunnyTrailer.ism/QualityLevels(5860924)/Manifest(video,format=m3u8-aapl,type=keyframes)&token=<省略>“
#EXT-X-STREAM-INF:BANDWIDTH=62973,CODECS=”mp4a.40.2″,AUDIO=”audio”
*************************
つまり、QualityLevels が記載されている行に、Proxy の URL、配信 URL および Token の記載を追加します。
例:
QualityLevels(960870)/Manifest(video,format=m3u8-aapl)
編集後
<Proxy URL><Azure Media Servicesの 配信 URL (manifest を記載なし : http://~.ism/)>
QualityLevels(960870)/Manifest(video,format=m3u8-aapl)<token 情報>
********
Github にあるサンプルを、WebApp と Token の扱いだけを編集すれば、そのまま使えますので、ぜひお試しください !!