Object Storage Service (OSS) は、リアルタイムメッセージングプロトコル (RTMP) を介して、H.264 形式でエンコードされたビデオストリームと AAC 形式でエンコードされたオーディオストリームのインジェストをサポートしています。インジェストされた音声データと動画データは、ビデオオンデマンドまたはライブストリーミングに使用できます。このトピックでは、音声ストリームと動画ストリームを OSS にインジェストする方法と、インジェストされたデータを再生する方法について説明します。
制限事項
-
RTMP ストリームインジェストのみをサポートしています。ストリームプルはサポートしていません。
-
インジェストするデータには、H.264 形式のビデオストリームを含める必要があります。
-
オーディオストリームはオプションです。含まれる場合、AAC 形式である必要があります。他の形式のストリームは破棄されます。
-
ダンプは HTTP ライブストリーミング (HLS) プロトコルのみをサポートしています。
-
1 つの LiveChannel に一度にストリームをインジェストできるのは、1 クライアントのみです。
OSS への音声・動画データのインジェスト
-
インジェスト URL を取得します。
SDK を使用して PutLiveChannel API を呼び出し、LiveChannel を作成してそのインジェスト URL を取得します。
-
バケットのアクセス制御リスト (ACL) が公開読み書き (public-read-write) の場合、取得したインジェスト URL を直接使用できます。
-
バケットの ACL が公開読み取り (public-read) または非公開 (private) の場合、URL に署名する必要があります。詳細については、「Signature V1」をご参照ください。
インジェスト URL は、Java SDK と Python SDK でのみ取得できます。
Java
import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.*; import java.util.List; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.ClientBuilderConfiguration; import com.aliyun.oss.common.comm.SignVersion; public class Demo { public static void main(String[] args) throws Exception { String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // バケット名を指定します。例:examplebucket。 String bucketName = "examplebucket"; // LiveChannel 名を指定します。 String liveChannelName = "yourLiveChannelName"; // バケットが配置されているリージョンを指定します。例:バケットが中国 (杭州) リージョンにある場合、リージョンを cn-hangzhou に設定します。 String region = "cn-hangzhou"; // OSSClient インスタンスを作成します。 // OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { CreateLiveChannelRequest request = new CreateLiveChannelRequest(bucketName, liveChannelName, "desc", LiveChannelStatus.Enabled, new LiveChannelTarget()); CreateLiveChannelResult result = ossClient.createLiveChannel(request); // インジェスト URL を取得します。 List<String> publishUrls = result.getPublishUrls(); for (String item : publishUrls) { // 署名情報を含まないインジェスト URL を取得します。 System.out.println(item); // 署名情報を含むインジェスト URL を取得します。 LiveChannelInfo liveChannelInfo = ossClient.getLiveChannelInfo(bucketName, liveChannelName); // expires パラメーターは、有効期限を Unix タイムスタンプで指定します。この例では、有効期限を現在時刻から 1 時間後に設定します。 long expires = System.currentTimeMillis() / 1000 + 3600; // playlistName パラメーターは、createLiveChannel オペレーションの呼び出し時に渡した名前です。このパラメーターを指定しない場合、デフォルト値の playlist.m3u8 が使用されます。getLiveChannelInfo オペレーションを呼び出してこの名前を取得することもできます。 String signRtmpUrl = ossClient.generateRtmpUri(bucketName, liveChannelName, liveChannelInfo.getTarget().getPlaylistName(), expires); System.out.println(signRtmpUrl); } // 再生 URL を取得します。 List<String> playUrls = result.getPlayUrls(); for (String item : playUrls) { System.out.println(item); } } catch (OSSException oe) { oe.printStackTrace(); // OSSException がキャッチされました。これは、リクエストが OSS に到達したものの、何らかの理由でエラーレスポンスで拒否されたことを意味します。 System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); // エラーメッセージ: System.out.println("Error Message:" + oe.getErrorMessage()); // エラーコード: System.out.println("Error Code:" + oe.getErrorCode()); // リクエスト ID: System.out.println("Request ID:" + oe.getRequestId()); // ホスト ID: System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { // ClientException がキャッチされました。これは、クライアントが OSS との通信を試みている間に、ネットワークにアクセスできないなど、深刻な内部問題が発生したことを意味します。 System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); // エラーメッセージ: System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }返されるインジェスト URL は次のとおりです:
rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?Expires=1688542428&OSSAccessKeyId=LTAI********&Signature=VfUgZt5N%2B6Uk4C9QH%2BzrRBTO2I****&playlistName=playlist.m3u8 http://examplebucket.oss-cn-hangzhou.aliyuncs.com/test-channel/playlist.m3u8Python
# -*- 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 名を指定します。例:test-channel。 channel_name = "test-channel" channel_cfg = oss2.models.LiveChannelInfo(target = oss2.models.LiveChannelInfoTarget()) channel = bucket.create_live_channel(channel_name, channel_cfg) publish_url = channel.publish_url # RTMP ストリームインジェスト用の署名付き URL を生成し、有効期限を 3,600 秒に設定します。 signed_publish_url = bucket.sign_rtmp_url(channel_name, "playlist.m3u8", 3600) # 署名なしのインジェスト URL を出力します。 print('publish_url='+publish_url) # 署名付きのインジェスト URL を出力します。 print('signed_publish_url='+signed_publish_url)返されるインジェスト URL は次のとおりです:
publish_url=rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel signed_publish_url=rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI********&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ckt0Iv**** -
-
インジェスト URL を使用して、音声データと動画データを OSS にインジェストします。
ストリーム取り込みによって生成されるファイルの命名規則は
<channel-name><timestamp>.tsです。ここで、<channel-name>はチャネル名、<timestamp>はファイルスライスが生成されたときのミリ秒単位のタイムスタンプです。FFmpeg
FFmpeg を使用して、ローカルの動画ファイルを OSS にインジェストできます。例:
ffmpeg -i 1.flv -c copy -f flv "rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live/test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI********&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ck***"OBS
-
OBS Studio をインストールします。
-
上部メニューで、 の順に選択します。
-
左側メニューで、[配信] をクリックします。
-
ダイアログボックスで次のパラメーターを設定します。
パラメーター
説明
サービス
ドロップダウンリストから カスタム を選択します。
サーバー
ステップ 1 の URL から、ストリーム取り込みの署名情報を除いて入力します:
rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live。ストリームキー
ステップ 1 で取得した署名付きストリームインジェスト情報を入力します:
test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI**************&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ck********。 -
OK をクリックします。
-
インジェストされた音声・動画の再生
ライブストリーミング
ストリームインジェスト中に、HLS プロトコルを使用してコンテンツを再生できます。再生方法はプラットフォームによって異なります。
-
Android や iOS などのモバイルプラットフォームでは、Web ブラウザーで LiveChannel の再生 URL を開きます。
-
macOS では、Safari ブラウザーを使用して再生できます。
-
PC では、VLC メディアプレーヤーをインストールして再生できます。インストール後、VLC メディアプレーヤーを開き、 の順に選択し、取得した再生 URL を [ネットワーク URL を入力してください] テキストボックスに入力します。
スムーズなライブストリーミングのため、短い FragDuration (たとえば 2 秒) と、それに応じた GOP (Group of Pictures) サイズを設定します。OBS では、この設定は [キーフレーム間隔] と呼ばれます。
OBS で、[設定] > [出力] に移動します。[出力モード] を [詳細] に設定します。[配信] タブで、[キーフレーム間隔 (秒、0=自動)] を 2 に設定します。
ビデオオンデマンド
ストリームインジェスト中、OSS はライブストリームとして M3U8 ファイルを継続的にプッシュまたは更新します。ストリームインジェストが終了したら、PostVodPlaylist API を呼び出して VOD プレイリストを作成する必要があります。再生にはこのプレイリストの URL を使用します。
ビデオオンデマンドのシナリオでは、GOP を大きく設定して .ts ファイルの数を減らすことで、ビットレートを低く抑えることができます。