OSS (Object Storage Service) では、RTMP (Real-Time Messaging Protocol) を使用して、ビデオおよびオーディオストリームをOSSバケットに取り込み、HTTPライブストリーミング (HLS) 形式でストリームを保存できます。 OSSには、バケットに保存されているオーディオおよびビデオデータに対するきめ細かいアクセス制御を実現するために使用できるさまざまな認証および承認方法も用意されています。
前提条件
バケット作成についての 詳細については、「バケットの作成」をご参照ください。
基本操作
OSSでは、RTMPを使用して、H.264エンコードされたビデオストリームとAAC (Advanced Audio Coding) エンコードされたオーディオストリームをOSSバケットにアップロードできます。 LiveChannelのPlayURLにアクセスすることで、アップロードされたオーディオおよびビデオデータを取得できます。
オーディオおよびビデオデータのアップロード
PutLiveChannel操作を呼び出して、LiveChannelを作成します。
LiveChannelが作成されると、PublishURLとPlayURLが返されます。 PublishURLはRTMPを使用してストリームを取り込むために使用され、PlayURLはオーディオおよびビデオデータを取得するために使用されます。
PublishURLを使用して、ビデオおよびオーディオストリームを取り込みます。
OSSは、アップロードされたオーディオまたはビデオファイルをM3U8インデックスオブジェクトとして保存し、複数のビデオオブジェクトをHLSプロトコルに基づいて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) は無効になっています。 ブラウザはバケットへのクロスオリジンリクエストを拒否します。 したがって、ウェブサイトに埋め込まれたビデオオブジェクトは再生できません。 次の図は、クロスオリジンリクエスト拒否の例を示しています。
OSSバケットに保存されているビデオおよびオーディオリソースへのクロスオリジンアクセスを許可するように、バケットのCORSを設定できます。
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、バケットの名前をクリックします。
左側のナビゲーションツリーで、 を選択します。
[CORS] ページで、ルールの作成をクリックします。
ルールの作成パネルで、CORSパラメータを設定します。
この例では、Sourceパラメーターの値は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部分のみを指定しないでください。
ブラウザは、CORS設定をキャッシュするのに数十秒から数分かかります。 CORS設定をすぐに有効にするには、ブラウザーのキャッシュをクリアしてからページを更新します。
ホットリンク保護
CORSは、オーディオまたはビデオリソースがサードパーティのWebサイトに埋め込まれるのを防ぐことができます。 ただし、CORS設定では、OSSバケットに保存されているオーディオまたはビデオリソースに直接アクセスできません。 この場合、ホットリンク保護を設定し、バケットにリファラーホワイトリストを指定して、オーディオまたはビデオリソースへの不正アクセスを防ぐことができます。
デフォルトでは、バケットはRefererフィールドが空のリクエストを許可します。 ブラウザを使用してLiveChannelのPlayURLにアクセスし、バケットに保存されているビデオオブジェクトを表示できます。 権限のないユーザーがオーディオまたはビデオリソースにアクセスしないようにするには、バケットのホットリンク保護を設定して、リファラーフィールドが空のリクエストを拒否し、信頼できるドメイン名またはIPアドレスをリファラーホワイトリストに追加します。 この場合、リファラーホワイトリストに含まれていないサードパーティのドメイン名またはIPアドレスからのリクエストは、403 Forbiddenエラーで失敗します。
OSSコンソールにログインします。
左側のナビゲーションウィンドウで、[バケット] をクリックします。 [バケット] ページで、バケットの名前をクリックします。
左側のナビゲーションツリーで、コンテンツセキュリティ>ホットリンク保護を選択します。
ホットリンク保護ページで、ホットリンク保護.をオンにします。
[リファラーホワイトリスト] フィールドに、ドメイン名またはIPアドレスを入力します。 例: * .aliyun.com
ビジネスシナリオに基づいて、さまざまなリファラーフィールドを設定できます。 リファラーの設定例については、「バケットのホットリンク保護の設定」をご参照ください。
Refererフィールドが空のリクエストを拒否するには、[空のRefererを許可] で [いいえ] を選択します。
説明[空のリファラーを許可] で [いいえ] を選択してリファラーホワイトリストを設定した場合、ホワイトリストで指定されたリファラーの1つを含むリクエストのみがバケット内のリソースにアクセスできます。
[空のリファラーを許可] で [いいえ] を選択し、リファラーホワイトリストを設定しない場合、空のリファラーフィールドを持つリクエストも許可されます。
保存をクリックします。
プライベートバケットの署名メカニズム
データセキュリティのため、バケットのACLはデフォルトでプライベートです。 したがって、プライベートバケットにデータを読み書きするリクエストを送信する場合、リクエストに署名を追加して、OSSへの操作権限を宣言する必要があります。
プライベートバケットにストリームを取り込む場合は、PublishURLに署名して、オーディオまたはビデオオブジェクトをバケットにアップロードする必要があります。 詳細については、「RTMPの取り込みURLと署名」をご参照ください。
次のサンプルコードは、OSS SDK for Pythonを使用して署名されたPublishURLを取得し、ストリームをバケットに取り込む方法の例を示しています。
次のサンプルコードは、次の形式の文字列を返します。
rtmp:// xxx.oss-cn-beijing.aliyuncs.com/live/xxx?playlistName=xxx&OSSAccessKeyId=xxx&Expires=xxx&Signature=xxx
ここで、Signatureパラメータの値は署名文字列であり、他のパラメータはストリーム関連情報を提供します。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsから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 = 'あなたの説明はこちら' 、
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の値をチェックします。 OSSに接続されているストリームは、ストリームの取り込みプロセス中にURLが期限切れになっても中断されません。
signed_rtmp_url = bucket.sign_rtmp_url(channel_name, playlist_name, expires=3600)
プリント (signed_rtmp_url)
オブジェクトURLを使用してプライベートバケット内のオブジェクトにアクセスする場合、URLに署名を追加する必要があります。 HLSストリームにアクセスすると、M3U8インデックスオブジェクトに動的にアクセスするリクエストが送信され、インデックスオブジェクトのコンテンツに基づいて最新のTSオブジェクトをダウンロードするリクエストが複数送信されます。 各リクエストのURLに署名を追加する必要があります。
より利便性を提供するために、OSSはオーディオおよびビデオデータにアクセスするための動的署名メカニズムを提供します。 M3U8ファイルに初めてアクセスするときは、x-oss-process=hls/sign
パラメーターをURLに追加する必要があります。OSSは、M3U8オブジェクトのURLに署名するのと同じ方法で、返されたプレイリスト内のすべてのTSファイルアドレスに自動的に署名します。
次のサンプルコードは、OSS SDK for Pythonを使用して、オーディオまたはビデオオブジェクトにアクセスするときにリクエストに署名を動的に追加する方法の例を示しています。
# ストリームの表示に使用される署名付きURLを取得します。
your_object_name = "test_rtmp_live/test.m3u8"
style = "hls/sign"
# デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 この場合、署名付き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)
プリント (signed_download_url)