Object Storage Service (OSS) では、RTMP を使用してオーディオおよびビデオストリームをバケットにアップストリーミングし、HLS フォーマットで保存できます。また、OSS は音声・映像データに対するきめ細かなアクセス制御を実現するための、さまざまな認証および権限付与メカニズムを提供しています。
前提条件
バケットを作成します。詳細については、「バケットの作成」をご参照ください。
基本操作
OSS では、RTMP を使用して H.264 エンコードされたビデオと AAC エンコードされたオーディオをアップロードできます。その後、PlayURL を使用してメディアデータにアクセスできます。
オーディオおよびビデオデータのアップロード
PutLiveChannel 操作を呼び出して LiveChannel を作成します。
この操作により、RTMP アップストリーミング用の PublishURL と再生用の PlayURL が返されます。
PublishURL を使用して、音声およびビデオストリームを取り込んでください。
OSS はアップロードされたストリームを HLS フォーマットに変換します。HLS フォーマットは、1 つの M3U8 インデックスファイルと複数の TS ビデオセグメントで構成されます。詳細については、「RTMP ストリームのアップストリーミング」をご参照ください。
オーディオおよびビデオデータの取得
Web ブラウザーで PlayURL(M3U8 インデックスファイルを指す URL)にアクセスすることで、オーディオおよびビデオデータを取得できます。
Android や iOS などのモバイルプラットフォームや、Microsoft Edge や Safari などの一部のデスクトップブラウザーは、M3U8 ファイルに直接アクセスすることでビデオを再生できます。Chrome などの他のブラウザーでは、Video.js などの埋め込み JavaScript ライブラリが必要です。
公開読み書きバケットにメディアをアップロードおよび取得する場合、誰でもデータにアクセスおよび変更できてしまいます。これにより、データ漏えいや予期しない課金が発生する可能性があります。デフォルトでは、OSS バケットへのアクセスは非公開であり、すべてのクロスオリジンリクエストは拒否されます。データを保護するには、ユースケースに応じて、オリジン間リソース共有 (CORS)、ホットリンク保護、または非公開バケット向けの署名付き URL のいずれか、または複数を併用することを推奨します。
オリジン間リソース共有 (CORS)
ブラウザーから直接ではなく、サードパーティの Web ページに OSS のビデオを埋め込む場合、再生を妨げるクロスオリジンの問題が発生することがあります。これは、Web ブラウザーが同一オリジンポリシーを適用しているためです。Web サーバーと OSS バケットが同じドメインにない場合、ブラウザーはデフォルトでリクエストをブロックします。
たとえば、http://192.168.xx.xx:8080 にある Web サーバーを考えてみます。ユーザーがこのサーバーからページにアクセスし、そのページに OSS バケット内の埋め込みビデオが含まれているとします。このとき、ブラウザーはビデオデータを取得するために OSS に別途リクエストを送信する必要があります。ブラウザーは、Web ページのオリジン(http://192.168.xx.xx:8080)と OSS バケットのオリジンが異なることを検出し、事前確認リクエスト(プリフライトリクエスト)をバケットに送信して許可を要求します。OSS にはデフォルトで CORS 構成が存在しないため、このリクエストは拒否され、ビデオの再生ができなくなります。次の図はこのプロセスを示しています:
この再生の問題は、OSS バケットに対してオリジン間リソース共有を構成することで解決できます。
-
OSS コンソール にログインします。
バケット をクリックし、対象のバケット名をクリックします。
左側のナビゲーションウィンドウで、 をクリックします。
ルールの作成 をクリックします。
ルールの作成 パネルでパラメーターを設定します。
この例では、ソース を http://192.168.xx.xx:8080 に設定します。その他のパラメーターについては、「CORS の構成」をご参照ください。
オリジンが特定のドメイン名の場合、www.example.com のように完全なドメイン名を入力してください。example.com のようにサブドメインを省略しないでください。
オリジンが特定の IP アドレスの場合、http://xx.xx.xx.xx:80 のように、プロトコルおよびポート番号を含む完全な URL を入力してください。xx.xx.xx.xx のように IP アドレスのみを入力しないでください。
ブラウザーは通常、数秒から数分間 CORS 構成をキャッシュします。新しい構成をすぐに有効にするには、ブラウザーのキャッシュをクリアしてページをリフレッシュしてください。
ホットリンク保護
CORS ルールは他の Web サイトによるメディアリソースの埋め込みを効果的に防止できますが、ユーザーが OSS バケット内のコンテンツに直接アクセスする場合は適用されません。このようなシナリオでは、OSS のホットリンク保護機能を使用できます。この機能により、バケットに Referer ホワイトリストを設定して不正アクセスを防止できます。
デフォルトでは、バケットは空の Referer を持つリクエストを許可します。つまり、ユーザーはローカルブラウザーから PlayURL に直接アクセスしてビデオを視聴できます。メディアの不正利用を防ぐには、バケットを設定して空の Referer を持つリクエストを拒否し、信頼できるドメインまたは IP アドレスを Referer ホワイトリストに追加します。この構成後、ホワイトリスト外からのサードパーティアクセスはすべて 403 Forbidden エラーで拒否されます。
-
OSS コンソール にログインします。
バケット をクリックし、対象のバケット名をクリックします。
左側のナビゲーションウィンドウで、コンテンツセキュリティ > ホットリンク保護 を選択します。
ホットリンク保護 ページで、ホットリンク保護 をオンにします。
Referer ホワイトリスト: ドメイン名または IP アドレスを入力します(例:*.aliyun.com)。
ユースケースに応じて、さまざまな Referer フィールドを設定できます。例については、「バケットのホットリンク保護の構成」をご参照ください。
空の Referer を許可: いいえ を選択します。
説明空の Referer を持つリクエストを拒否し、Referer ホワイトリストを構成した場合、ホワイトリスト内の Referer ヘッダーを持つリクエストのみが OSS リソースにアクセスできます。
空の Referer を持つリクエストを拒否しても Referer ホワイトリストを構成しない場合、この設定は無効となり、空の Referer を持つリクエストは引き続き許可されます。
設定 をクリックします。
非公開バケットの署名メカニズム
データを保護するため、OSS バケットのアクセス制御レベルはデフォルトで非公開になっています。そのため、非公開バケットに対する読み取りまたは書き込みを行う際には、リクエストに署名を含めて権限を検証する必要があります。
非公開バケットにストリームをアップストリーミングする際は、オーディオおよびビデオファイルをアップロードする前に、アップストリーミング URL に署名する必要があります。詳細については、「RTMP アップストリーミング URL と署名」をご参照ください。
次の Python SDK の例は、署名付きアップストリーミング URL を取得する方法を示しています:
この例は、次の形式の文字列を返します:
rtmp://xxx.oss-cn-beijing.aliyuncs.com/live/xxx?playlistName=xxx&OSSAccessKeyId=xxx&Expires=xxx&Signature=xxx
Signature の値が署名であり、上記のパラメーターにはビデオストリームに関する情報が含まれています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。このコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイント。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントは https://oss-cn-hangzhou.aliyuncs.com に設定します。
# バケット名(例:examplebucket)。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# ライブチャンネルを作成および構成します。
# インデックスファイルには、それぞれ持続時間が 5 秒の TS ファイルが 3 つ含まれます。5 秒の持続時間は推奨値であり、実際の持続時間はキーフレーム間隔に依存します。
channel_name = "your_channel_name"
playlist_name = "your_playlist_name.m3u8"
frag_count_config = 3
frag_duration_config = 5
create_result = bucket.create_live_channel(
channel_name,
oss2.models.LiveChannelInfo(
status = 'enabled',
description = 'your description here',
target = oss2.models.LiveChannelInfoTarget(
playlist_name = playlist_name,
frag_count = frag_count_config,
frag_duration = frag_duration_config)))
# 署名付き RTMP アップストリーミング URL を取得します。
# 'expires' パラメーターは、現在時刻からの URL の有効期間(秒単位)を指定します。
# signed_url を取得したら、アップストリーミングツールを使用してストリームをプッシュできます。URL の有効期限は初期接続時にのみチェックされます。接続が確立されると、URL の有効期限が切れてもストリームは切断されません。
signed_rtmp_url = bucket.sign_rtmp_url(channel_name, playlist_name, expires=3600)
print(signed_rtmp_url)非公開バケット内のファイルにアクセスする際は、URL に署名を含める必要があります。HLS は、M3U8 インデックスファイルに動的にアクセスした後、そのインデックスに基づいて最新の TS セグメントをダウンロードするための複数のリクエストを送信します。これらの各リクエストには、URL に署名を含める必要があります。

このプロセスを簡略化するため、OSS ではメディアアクセス用の動的署名メカニズムを提供しています。M3U8 ファイルに最初にアクセスする際に、URL に x-oss-process=hls/sign パラメーターを追加するだけで、OSS が返されるプレイリスト内のすべての TS ファイル URL を M3U8 URL と同じ方法で自動的に署名します。
次の Python SDK の例は、動的署名メカニズムを使用してオーディオおよびビデオデータにアクセスする方法を示しています:
# ストリーム視聴用の動的署名付き URL を取得します。
your_object_name = "test_rtmp_live/test.m3u8"
style = "hls/sign"
# OSS が署名付き URL を生成する際、デフォルトではオブジェクトパス全体に含まれるスラッシュ (/) をエスケープします。これにより、URL が使用できなくなる可能性があります。
# slash_safe を True に設定すると、OSS がスラッシュをエスケープしなくなり、署名付き URL をそのまま使用できるようになります。
signed_download_url = bucket.sign_url('GET', your_object_name, 3600, params={'x-oss-process': style}, slash_safe=True)
print(signed_download_url)