Object Storage Service (OSS) では、リアルタイムメッセージングプロトコル (RTMP) を使用して、ビデオおよびオーディオストリームを OSS バケットにアップストリーミングし、HTTP Live Steaming (HLS) 形式で保存できます。 OSS はまた、バケットに保存されているオーディオおよびビデオデータに対してきめ細かいアクセス制御を実現するために使用できるさまざまな認証および権限付与方法を提供します。
前提条件
バケットが作成されていること。 詳細については、「バケットの作成」をご参照ください。
基本操作
OSS では、RTMP を使用して、H.264 でエンコードされたビデオストリームと Advanced Audio Coding (AAC) でエンコードされたオーディオストリームを OSS バケットにアップロードできます。 アップロードされたオーディオおよびビデオデータは、LiveChannel の PlayURL にアクセスすることで取得できます。
オーディオおよびビデオデータをアップロードする
PutLiveChannel 操作を呼び出して、LiveChannel を作成します。
LiveChannel が作成されると、PublishURL と PlayURL が返されます。 PublishURL は RTMP を使用したストリームのアップストリーミングに使用され、PlayURL はオーディオおよびビデオデータの取得に使用されます。
PublishURL を使用して、ビデオおよびオーディオストリームをアップストリーミングします。
OSS は、アップロードされたオーディオまたはビデオファイルを、HLS プロトコルに基づいて、M3U8 インデックスオブジェクトと複数の TS 形式のビデオオブジェクトとして保存します。 詳細については、「RTMP 経由のストリームのアップストリーミング」をご参照ください。
オーディオおよびビデオデータを取得する
LiveChannel を使用してアップロードされたオーディオおよびビデオデータを取得するには、ブラウザから LiveChannel の PlayURL にアクセスして、M3U8 インデックスオブジェクトにアクセスします。
Android および iOS モバイルデバイス、および Microsoft Edge や Safari など PC 上の一部のブラウザを使用して、M3U8 インデックスオブジェクトにアクセスしてビデオオブジェクトを再生できます。 Google Chrome などの他のブラウザを使用する場合は、Video.js などの JavaScript スクリプトをブラウザに埋め込んで、ビデオオブジェクトを再生する必要があります。
公開読み書きバケットにオーディオおよびビデオデータをアップロードすると、すべてのユーザーがバケット内のデータを読み書きできるため、データ漏洩が発生したり、追加のトラフィック料金が発生したりする可能性があります。 バケットのデフォルトのアクセス制御リスト (ACL) は非公開であり、バケットはすべてのクロスオリジンリクエストを拒否します。 ビジネスシナリオに基づいてデータセキュリティを確保するには、次のセクションで説明する 1 つ以上の方法を使用することをお勧めします。
CORS
ブラウザのアドレスバーからオブジェクト URL を直接使用してではなく、サードパーティの Web サイトに埋め込まれたリンクを使用して OSS バケットに保存されているオーディオまたはビデオオブジェクトをリクエストする場合、クロスオリジンのアクセス制限が原因で、リクエストされたオーディオまたはビデオの再生に失敗する可能性があります。 サードパーティ Web サイトの Web サーバーとオーディオまたはビデオオブジェクトを保存するバケットのオリジンが異なるため、ブラウザはリクエストをクロスオリジンリクエストとして識別します。 ブラウザはセキュリティ上の理由から同一オリジンポリシーを適用し、Web サーバーがバケットの許可されたオリジンの 1 つでない場合、このクロスオリジンリクエストを拒否します。
たとえば、Web サイト http://192.168.xx.xx:8080 は JavaScript コードを使用して、OSS バケットに保存されているビデオへのリンクを埋め込みます。 リンクをクリックすると、ブラウザはオブジェクトのリクエストを OSS に送信します。 ただし、ブラウザはバケットと http://192.168.xx.xx:8080 Web サイトのオリジンが異なることを識別し、バケットがクロスオリジンリクエストを許可するかどうかを確認するためのプリフライトリクエストを送信します。 デフォルトでは、OSS バケットではオリジン間リソース共有 (CORS) は無効になっています。 ブラウザは、バケットへのクロスオリジンリクエストを拒否します。 そのため、Web サイトに埋め込まれたビデオオブジェクトを再生できません。 次の図は、クロスオリジンリクエストの拒否の例を示しています。
バケットの CORS を構成して、OSS バケットに保存されているビデオおよびオーディオリソースへのクロスオリジンアクセスを許可できます。
OSS コンソール にログオンします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、バケットの名前をクリックします。
左側のナビゲーションツリーで、 を選択します。
CORS ページで、[ルールの作成] をクリックします。
[ルールの作成] パネルで、CORS パラメーターを構成します。
この例では、[オリジン] パラメーターの値は http://192.168.xx.xx:8080 に設定されています。 CORS 設定の詳細については、「CORS の構成」をご参照ください。
ドメイン名を使用してオリジンを指定する場合は、完全なドメイン名を入力します。 たとえば、www.example.com と入力し、ドメイン名を example.com に短縮しないでください。
IP アドレスを使用してオリジンを指定する場合は、プロトコルタイプ、IP アドレス、ポート番号を含む完全なオリジン URL を入力します。 たとえば、http://xx.xx.xx.xx:80 と入力し、xx.xx.xx.xx の部分だけを指定しないでください。
ブラウザが CORS 構成をキャッシュするには、数十秒から数分かかります。 CORS 構成をすぐに有効にするには、ブラウザのキャッシュをクリアしてからページをリフレッシュします。
ホットリンク保護
CORS は、オーディオまたはビデオリソースがサードパーティの Web サイトに埋め込まれるのを防ぐことができます。 ただし、CORS 構成では、OSS バケットに保存されているオーディオまたはビデオリソースに直接アクセスされるのを防ぐことはできません。 この場合、ホットリンク保護を構成し、バケットの Referer ホワイトリストを指定して、オーディオまたはビデオリソースへの不正アクセスを防ぐことができます。
デフォルトでは、バケットは Referer フィールドが空のリクエストを許可します。 ブラウザを使用して LiveChannel の PlayURL にアクセスし、バケットに保存されているビデオオブジェクトを表示できます。 オーディオまたはビデオリソースに権限のないユーザーがアクセスするのを防ぐには、バケットのホットリンク保護を構成して、Referer フィールドが空のリクエストを拒否し、信頼できるドメイン名または IP アドレスを Referer ホワイトリストに追加します。 この場合、Referer ホワイトリストに含まれていないサードパーティのドメイン名または IP アドレスからのリクエストは、403 Forbidden エラーで失敗します。
OSS コンソール にログオンします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、バケットの名前をクリックします。
左側のナビゲーションツリーで、[コンテンツセキュリティ] > [ホットリンク保護] を選択します。
[ホットリンク保護] ページで、[ホットリンク保護] をオンにします。
[Referer ホワイトリスト] フィールドに、ドメイン名または IP アドレスを入力します。 例: *.aliyun.com。
ビジネスシナリオに基づいて異なる Referer フィールドを構成できます。 Referer 構成の例については、「バケットのホットリンク保護の構成」をご参照ください。
[空の Referer を許可する] で [いいえ] を選択して、Referer フィールドが空のリクエストを拒否します。
説明[空の Referer を許可する] で [いいえ] を選択し、Referer ホワイトリストを構成した場合、ホワイトリストで指定された Referer のいずれかを含むリクエストのみがバケット内のリソースにアクセスできます。
[空の Referer を許可する] で [いいえ] を選択し、Referer ホワイトリストを構成しない場合、Referer フィールドが空のリクエストも許可されます。
[保存] をクリックします。
非公開バケットの署名メカニズム
データセキュリティのために、バケットの ACL はデフォルトで非公開になっています。 そのため、非公開バケットにリクエストを送信してデータを読み書きするには、リクエストに署名を追加して、OSS に対する操作権限を宣言する必要があります。
非公開バケットにストリームをアップストリーミングするには、PublishURL に署名して、オーディオまたはビデオオブジェクトをバケットにアップロードする必要があります。 詳細については、「RTMP アップストリーミング URL と署名」をご参照ください。
次のサンプルコードは、Python 用 OSS SDK を使用して署名付き PublishURL を取得し、バケットにストリームをアップストリーミングする方法の例を示しています。
次のサンプルコードは、次の形式の文字列を返します。
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')
# LiveChannel を作成して構成します。
# インデックスオブジェクトには 3 つの TS オブジェクトが含まれており、各 TS オブジェクトの期間は 5 秒です。 この例の 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 を使用したストリームのアップストリーミングに使用される署名付き PublishURL を取得します。
# 例の expires の値は、現在の時刻から URL の有効期限までの秒単位の時間の長さを示します。
# signed_url を取得したら、データアップストリーミングツールを使用して OSS にストリームをアップストリーミングできます。 OSS は、ストリームアップストリーミングの接続を確立するときにのみ、expires の値をチェックします。 ストリームアップストリーミングプロセス中に URL の有効期限が切れても、OSS に接続されているストリームは一時停止されません。
signed_rtmp_url = bucket.sign_rtmp_url(channel_name, playlist_name, expires=3600)
print(signed_rtmp_url)オブジェクト URL を使用して非公開バケット内のオブジェクトにアクセスする場合は、URL に署名を追加する必要があります。 HLS ストリームにアクセスすると、M3U8 インデックスオブジェクトに動的にアクセスするためのリクエストが送信され、次にインデックスオブジェクトの内容に基づいて最新の TS オブジェクトをダウンロードするための複数のリクエストが送信されます。 各リクエストの URL に署名を追加する必要があります。

利便性を高めるために、OSS はオーディオおよびビデオデータにアクセスするための動的署名メカニズムを提供します。 M3U8 ファイルに初めてアクセスするときに、URL に x-oss-process=hls/sign パラメーターを追加する必要があります。OSS は、M3U8 オブジェクトの URL に署名するのと同じ方法で、返されたプレイリスト内のすべての TS ファイルアドレスに自動的に署名します。
次のサンプルコードは、オーディオまたはビデオオブジェクトにアクセスするときに、Python 用 OSS 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)