すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:RTMP アップストリーミングを使用したデータのアップロード

最終更新日:Feb 15, 2026

Object Storage Service (OSS) では、リアルタイムメッセージングプロトコル (RTMP) を使用して、H.264 エンコードされた動画ストリームおよび AAC エンコードされた音声ストリームを OSS にプッシュできます。アップストリーミングされた音声および動画データは、ビデオオンデマンド (VOD) またはライブストリーミングに使用できます。本トピックでは、音声および動画ストリームを OSS にプッシュする方法と、アップストリーミングされた音声および動画データを再生する方法について説明します。

制限事項

  • RTMP ストリームのアップストリーミングのみがサポートされています。ストリームのプルはサポートされていません。

  • アップロードされるデータには、H.264 フォーマットの動画ストリームが含まれている必要があります。

  • 音声ストリームは任意です。音声ストリームが含まれる場合、AAC フォーマットである必要があります。他のフォーマットの音声ストリームは破棄されます。

  • ダンプには HTTP Live Streaming (HLS) のみがサポートされています。

  • 1 つの LiveChannel に対して、同時にアップストリーミングできるクライアントは 1 つだけです。

OSS への音声および動画データのプッシュ

  1. アップストリーミング 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.m3u8

    Python

    # -*- 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****
  2. アップストリーミング 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 を使用したアップストリーミング

    1. OBS Studio をインストールします。

    2. 上部のナビゲーションバーで、File > Settings を選択します。

    3. 左側のナビゲーションウィンドウで、Stream をクリックします。

    4. 表示されるダイアログボックスで、次の表に従ってパラメーターを設定します。

      パラメーター

      説明

      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********

    5. OK をクリックします。

OSS にプッシュされた音声および動画データの再生

ライブストリーミング シナリオ

アップストリーミング中は、HLS プロトコルを使用して、現在アップストリーミング中のコンテンツを再生できます。プラットフォームごとの再生方法は次のとおりです:

  • Android や iOS などのモバイルプラットフォームでは、ブラウザに LiveChannel の再生 URL を入力します。

  • macOS では、Safari ブラウザを使用して再生します。

  • PC では、VLC メディアプレーヤーを使用して再生します。プレーヤーをインストール後、Media > Open Network Stream... を選択し、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 ファイルの数を減らし、ビットレートを低下させることができます。

参考情報