OSS は、リアルタイムメッセージングプロトコル (RTMP) を使用した H.264 エンコードのビデオストリームと AAC エンコードのオーディオストリームのプッシュをサポートしています。アップストリーミングされたデータは、ビデオオンデマンドまたはライブストリーミングのシナリオで使用できます。この Topic では、オーディオストリームとビデオストリームを OSS にプッシュし、アップストリーミングされたデータを再生する方法について説明します。
制限事項
RTMP アップストリーミングのみがサポートされています。ストリームのプルはサポートされていません。
アップロードされたデータには、H.264 フォーマットのビデオストリームが含まれている必要があります。
オーディオストリームはオプションです。オーディオストリームを含める場合、AAC フォーマットである必要があります。他のフォーマットのオーディオストリームは破棄されます。
ダンプでは、HTTP Live Steaming (HLS) プロトコルのみがサポートされています。
一度に 1 つの LiveChannel にストリームをプッシュできるクライアントは 1 つだけです。
オーディオデータとビデオデータを OSS にプッシュする
アップストリーミング URL を取得します。
SDK を使用して PutLiveChannel 操作を呼び出し、LiveChannel を作成してそのアップストリーミング URL を取得します。
バケットのアクセス制御リスト (ACL) が公開読み書きに設定されている場合、取得したアップストリーミング URL を直接アップストリーミングに使用できます。
バケットの ACL が公開読み取りまたは非公開に設定されている場合は、URL に署名する必要があります。URL の署名方法の詳細については、「署名 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(); 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 を生成し、有効期限を 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 にプッシュします。
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 をインストールします。
上部のナビゲーションバーで、 を選択します。
左側のナビゲーションウィンドウで、[配信] をクリックします。
表示されるダイアログボックスで、次の表の説明に従ってパラメーターを設定します。
パラメーター
説明
サービス
ドロップダウンリストから [カスタム] を選択します。
サーバー
ステップ 1 で取得した、署名情報を含まないアップストリーミング URL を入力します:
rtmp://examplebucket.oss-cn-hangzhou.aliyuncs.com/live。ストリームキー
ステップ 1 で取得した署名付きアップストリーミング情報を入力します:
test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI**************&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ck********。[OK] をクリックします。
OSS にプッシュされたオーディオデータとビデオデータを再生する
ライブストリーミングシナリオ
アップストリーミング中に、HLS プロトコルを使用してアップストリーミングされたコンテンツを再生できます。再生方法はプラットフォームによって異なります。
Android や iOS などのモバイルプラットフォームでは、LiveChannel の再生 URL をブラウザに入力します。
macOS では、Safari ブラウザを使用して再生します。
PC では、VLC メディアプレーヤーをインストールして再生します。インストールが完了したら、VLC メディアプレーヤーを開き、 を選択し、[ネットワーク URL を入力してください] テキストボックスに再生 URL `play_url` を入力します。
スムーズなライブストリーミングを行うには、`FragDuration` を 2 秒などの小さい値に設定します。さらに、GOP (group of pictures) のサイズを LiveChannel の `FragDuration` と同じに設定します。OBS で GOP (または キーフレーム間隔) を設定するには、次の手順に従います。

ビデオオンデマンドシナリオ
アップストリーミング中、OSS はライブストリームとして M3U8 ファイルを継続的にプッシュおよび更新します。アップストリーミングが完了したら、PostVodPlaylist 操作を呼び出して、ビデオオンデマンド再生用の M3U8 ファイルをアセンブルする必要があります。その後、このファイルの URL を使用して再生できます。
ビデオオンデマンドシナリオでは、GOP を大きく設定して TS ファイルの数を減らし、ビットレートを下げることができます。