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

Object Storage Service:RTMPを介したストリーム取り込み

最終更新日:Dec 23, 2024

H.264エンコードされたビデオストリームとAAC (Advanced Audio Coding) エンコードされたオーディオストリームを、RTMP (Real-Time Messaging Protocol) を介してOSS (Object Storage Service) に取り込むことができます。 OSSにアップロードされたオーディオおよびビデオデータは、ビデオオンデマンド (VOD) またはライブストリーミングに使用できます。 このトピックでは、オーディオおよびビデオストリームをOSSに取り込み、アップロードされたオーディオおよびビデオデータを再生する方法について説明します。

制限事項

  • RTMPを使用する場合、ビデオまたはオーディオストリームのみを取り込むことができます。 ストリームをプルすることはできません。

  • アップロードされるオーディオおよびビデオデータには、H.264ビデオストリームが含まれます。

  • オーディオデータとビデオデータにオーディオストリームを含めるかどうかを指定できます。 オーディオにはAACエンコードされたオーディオストリームのみがサポートされます。 他のフォーマットのオーディオストリームは破棄される。

  • OSSにオーディオおよびビデオデータを保存するには、HTTPライブストリーミング (HLS) のみを使用できます。

  • LiveChannelは、一度に1つのクライアントからのみ取り込まれたストリームを受信できます。

OSS へのオーディオストリームやビデオストリームの取り込み

  1. 取り込みURLを取得します。

    OSS SDKを使用してPutLiveChannel操作を呼び出し、LiveChannelを作成して取り込みURLを取得します。

    • バケットアクセス制御リスト (ACL) をpublic-read-writeに設定した場合、取得した取り込みURLを使用して、オーディオストリームとビデオストリームをOSSに取り込むことができます。

    • バケットACLをpublic-readまたはprivateに設定した場合、インジェストURLに署名を追加する必要があります。 詳細については、「URLへの署名の追加」をご参照ください。

    取り込みURLを取得するには、OSS SDK for JavaとOSS SDK for Pythonのみを使用できます。

    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.*;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
            // Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
            EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
            // Specify the name of the bucket. Example: examplebucket. 
            String bucketName = "examplebucket";
            // Specify the name of the LiveChannel. 
            String liveChannelName = "yourLiveChannelName";
            // Specify the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the region to cn-hangzhou.
            String region = "cn-hangzhou";
    
            // Create an OSSClient instance. 
            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);
    
                // Query the ingest URL. 
                List<String> publishUrls = result.getPublishUrls();
                for (String item : publishUrls) {
                    // Query the ingest URL that does not contain the signature information. 
                    System.out.println(item);
    
                    // Query the ingest URL that contains the signature information. 
                    LiveChannelInfo liveChannelInfo = ossClient.getLiveChannelInfo(bucketName, liveChannelName);
                    // expires specifies the validity period of the URL. The value of expires is a timestamp that follows the UNIX time format. In this example, the validity period is 1 hour. 
                    long expires = System.currentTimeMillis() / 1000 + 3600;
                    // playlistName specifies the name of the playlist when you call the createLiveChannel operation. If you do not specify this parameter when you call the createLiveChannel operation, the default value "playlist.m3u8" is used. You can call the getLiveChannelInfo operation to query the name of the playlist. 
                    String signRtmpUrl = ossClient.generateRtmpUri(bucketName, liveChannelName, liveChannelInfo.getTarget().getPlaylistName(), expires);
                    System.out.println(signRtmpUrl);
                }
    
                // Query the streaming 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
    
    # Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured. 
    auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
    # Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. 
    # Specify the name of the bucket. Example: examplebucket. 
    bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
    # Specify the name of the LiveChannel. Example: 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
    # Generate a signed ingest URL based on RTMP and set the validity period of the URL to 3600. Unit: seconds. 
    signed_publish_url = bucket.sign_rtmp_url(channel_name, "playlist.m3u8", 3600)
    # Display the unsigned ingest URL. 
    print('publish_url='+publish_url)
    # Display the signed ingest 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に取り込みます。

    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. Open Broadcaster Software (OBS) Studioをインストールします。

    2. 上部のナビゲーションバーで、[ファイル] > [設定] を選択します。

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

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

      パラメーター

      説明

      ストリームタイプ

      ドロップダウンリストから [カスタムストリーミングサーバー] を選択します。

      URL

      手順1: rtmp:// examplebucket.oss-cn-hangzhou.aliyuncs.com/liveで取得した未署名取り込みURLを入力します。

      ストリームキー

      ステップ1で取得した署名入り取り込みURLを入力します。test-channel?playlistName=playlist.m3u8&OSSAccessKeyId=LTAI **************&Expires=1688543369&Signature=eqK8z0ZTSwznP7fkELy0ck *********

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

OSS にアップロードされたオーディオデータやビデオデータの再生

ライブストリーム

ストリームの取り込み中に、HLSを使用して、次のプラットフォームでアップロードされているオーディオおよびビデオデータを再生できます。

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

  • macOSプラットフォームでは、Safariを使用してオーディオおよびビデオデータを再生します。

  • コンピューターにVLCメディアプレーヤーをインストールして、オーディオとビデオのデータを再生します。 VLCメディアプレーヤーをインストールしたら、VLCメディアプレーヤーページで [メディア (M)] > [ネットワークストリーミングを開く] を選択し、取得した再生URLを [ネットワークURLを入力してください] フィールドに入力します。

スムーズなストリーミングエクスペリエンスを確保するために、FragDurationを2秒などの小さな値に設定できます。 また、グループ・オブ・ピクチャ (GOP) を、LiveChannelのFragDurationと同じ固定値に設定することを推奨します。 次の図は、OBSでGOP (キーフレーム間隔) を設定する方法を示しています。

VOD

OSSにストリームを取り込むとき、OSSはライブストリーミングを使用してM3U8オブジェクトを取り込みまたは更新します。 ストリームの取り込み後にPostVodPlaylist操作を呼び出して、VOD用のM3U8オブジェクトを組み立て、オブジェクトのURLを使用してアップロードされたオーディオおよびビデオデータを再生する必要があります。

VODシナリオでは、より大きなGOPを設定して、トランスポートストリーム (TS) オブジェクトの数とビットレートを減らすこともできます。

関連ドキュメント