Object Storage Service (OSS) では、リアルタイムメッセージングプロトコル (RTMP) を使用して、H.264 エンコードされた動画ストリームおよび AAC エンコードされた音声ストリームを OSS にプッシュできます。アップストリーミングされた音声および動画データは、ビデオオンデマンド (VOD) またはライブストリーミングに使用できます。本トピックでは、音声および動画ストリームを OSS にプッシュする方法と、アップストリーミングされた音声および動画データを再生する方法について説明します。
制限事項
RTMP ストリームのアップストリーミングのみがサポートされています。ストリームのプルはサポートされていません。
アップロードされるデータには、H.264 フォーマットの動画ストリームが含まれている必要があります。
音声ストリームは任意です。音声ストリームが含まれる場合、AAC フォーマットである必要があります。他のフォーマットの音声ストリームは破棄されます。
ダンプには HTTP Live Streaming (HLS) のみがサポートされています。
1 つの LiveChannel に対して、同時にアップストリーミングできるクライアントは 1 つだけです。
OSS への音声および動画データのプッシュ
アップストリーミング URL を取得します。
ソフトウェア開発キット (SDK) を使用して PutLiveChannel 操作を呼び出し、LiveChannel を作成し、そのアップストリーミング URL を取得します。
バケットのアクセス制御リスト (ACL) が公開読み書きの場合、取得したアップストリーミング URL をそのまま使用してストリームをアップストリーミングできます。
バケット ACL が公開読み取りまたは非公開の場合、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"; // バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、Region を 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); // 有効期限(UNIX タイムスタンプで指定)。この例では、有効期限を 1 時間に設定しています。 long expires = System.currentTimeMillis() / 1000 + 3600; // 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(); 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()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { 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 を生成し、生存時間 (TTL) を 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=eqK8z0ZTSwznP7fkELy0ckt0Iv***"OBS を使用したアップストリーミング
OBS Studio をインストールします。
上部のナビゲーションバーで、 を選択します。
左側のナビゲーションウィンドウで、Stream をクリックします。
表示されるダイアログボックスで、次の表に従ってパラメーターを設定します。
パラメーター
説明
Service
ドロップダウンリストから Custom を選択します。
Server
ステップ 1 で取得した署名情報が含まれていないアップストリーミング URL を入力します:
rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live。Stream Key
ステップ 1 で取得したアップストリーミング URL の署名情報を入力します:
test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI**************&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ck********。OK をクリックします。
OSS にプッシュされた音声および動画データの再生
ライブストリーミング シナリオ
アップストリーミング中は、HLS プロトコルを使用して、現在アップストリーミング中のコンテンツを再生できます。プラットフォームごとの再生方法は次のとおりです:
Android や iOS などのモバイルプラットフォームでは、ブラウザに LiveChannel の再生 URL を入力します。
macOS では、Safari ブラウザを使用して再生します。
PC では、VLC メディアプレーヤーを使用して再生します。プレーヤーをインストール後、 を選択し、Please enter a network URL テキストボックスに再生 URL を入力します。
スムーズなライブストリーミングを実現するには、FragDuration を短く(たとえば 2 秒)設定してください。また、LiveChannel の FragDuration と同じ値になるように、ピクチャグループ (GOP) サイズを設定することを推奨します。次の図は、OBS での GOP(または keyframe Interval)の設定方法を示しています:

VOD シナリオ
アップストリーミング中、OSS は M3U8 ファイルをライブストリームとしてプッシュまたは更新します。アップストリーミングが完了したら、PostVodPlaylist 操作を呼び出して、VOD 用の M3U8 ファイルを生成する必要があります。その後、このファイルの URL を使用して再生できます。
VOD シナリオでは、より大きな GOP を設定することで .ts ファイルの数を減らし、ビットレートを低下させることができます。