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

Intelligent Media Management:ライブトランスコーディング

最終更新日:Jun 17, 2025

ライブトランスコーディングは、オンライン ビデオストリーミングのニーズを満たすように設計された Intelligent Media Management (IMM) のリアルタイム トランスコーディング機能です。このトピックでは、ライブトランスコーディングの利点と使用方法について説明します。

概要

再生を開始する前にビデオ全体をトランスコードする必要がある メディアトランスコーディング とは異なり、ライブトランスコーディングは必要なビデオセグメントのみを処理し、元のビデオファイルをアップロードした直後に再生を開始できます。ライブトランスコーディングには、次の利点があります。

  • トランスコード中のインスタント再生とバッファリングなし

  • 最適化されたトランスコーディングとスムーズな再生、数秒で完了するスクラブ

  • オンデマンド トランスコーディング、トランスコード済みファイルの削除時の再トランスコード、トランスコーディングとストレージ コストの削減

  • 多数のカスタム トランスコーディング パラメーターを使用したカスタム トランスコーディング

  • 300 を超えるオーディオおよびビデオ フォーマットとの優れた互換性

説明

ライブトランスコーディングは匿名再生をサポートしていません。

使用プロセス

  1. ビデオファイルを Object Storage Service (OSS) にアップロードします。

  2. GenerateVideoPlaylist オペレーションを呼び出してプレイリストを作成し、OSS の署名機能を使用してプレイリストに署名します。

  3. プレーヤーを使用してプレイリストを取得し、再生を開始します。ビデオ再生は、ライブトランスコーディングを自動的にトリガーします。

シナリオ

  • ネットワークドライブに保存されているビデオの再生:ライブトランスコーディングを使用すると、ネットワークドライブ内のビデオを、実際のネットワーク状況に最適な解像度でクライアントのリクエストに応じて即座に再生できます。これにより、リアルタイム再生が保証され、デバイス間で優れたビデオ互換性が提供されます。また、ライブトランスコーディングでは、リクエストされない場合、ネットワークドライブ内のビデオはトランスコードされないため、ストレージ コストも削減されます。

  • ソーシャルメディア プラットフォームでのビデオのプレビューと再生:ライブトランスコーディングを使用すると、インスタントメッセージおよびソーシャルメディア プラットフォームのユーザーは、受信したビデオをすぐに再生できます。これにより、コミュニケーションの適時性が向上します。さらに、ユーザーが長時間視聴されていないチャット履歴のビデオを再生する場合でも、ストレージの使用量を削減するためにビデオ用に生成された TS オブジェクトが定期的にクリアされても、ビデオを即座に再生できます。

  • フォーラムおよびブログ プラットフォームでのビデオコンテンツの共有:ライブトランスコーディングは、フォーラムおよびブログ プラットフォームのユーザーに、スムーズでデバイス互換性のあるビデオ視聴体験を提供します。ユーザーは、ネットワーク状況に最適な解像度で共有ビデオをすぐに再生できます。

利点

次の表に、ライブトランスコーディングの利点を詳しく説明します。

利点

説明

標準化

  • ライブトランスコーディングは、HTTP ライブストリーミングプロトコル (HLS) をサポートしています。

  • ライブトランスコーディングは、メディアプレイリストとマスタープレイリストをサポートしています。

  • ライブトランスコーディングにより、複数のビデオストリーム、オーディオストリーム、および字幕ストリームを含むビデオを再生できます。

  • ライブトランスコーディングは、主流の HLS プレーヤーをサポートしています。

  • ライブトランスコーディングは、 300 を超える主流のオーディオおよびビデオ フォーマットをサポートしています。

費用対効果

  • 再生されないビデオとビデオセグメントはトランスコードされないため、トランスコーディングのオーバーヘッドが削減されます。

  • トランスコードされたビデオセグメントを削除して、ストレージの使用量を削減できます。トランスコードされたビデオファイルまたはセグメントが削除されたビデオを再生すると、トランスコーディングが再びトリガーされるため、オンライン再生エクスペリエンスへの影響を回避できます。

高効率

  • IMM は大規模なサーバークラスターを採用しているため、多数のライブトランスコーディング タスクをサポートしています。

  • ビデオをさまざまな解像度とビットレートのビデオストリームに変換して、さまざまなネットワーク状況でスムーズな再生を保証できます。

  • 視聴者は、プレイリストが生成されるとすぐにビデオを再生でき、ビデオが完全にトランスコードされるまで待つ必要はありません。

  • ビデオヘッダーセグメントサイズは適応型であるため、ビデオの読み込みがより効率的になります。

  • インテリジェントなプリトランスコーディングがサポートされています。

サポートされているオーディオおよびビデオ フォーマット

ライブトランスコーディング機能は、 300 を超えるさまざまなタイプを含む、事実上すべてのオーディオおよびビデオ フォーマットをサポートしています。次の表に、ライブトランスコーディングでサポートされている一般的なオーディオおよびビデオ フォーマットの一部を示します。

入力ビデオ フォーマット

AVI、MOV、FLV、MKV、WebM、MPEG、WMV、RM、VOB、TS などの主流フォーマット

入力オーディオ フォーマット

MP3、WAV、AAC、FLAC、WMA などの主流フォーマット

出力コンテナ フォーマット

ts

前提条件

  1. AccessKey ペアが作成され、取得されます。詳細については、「AccessKey ペアを作成する」をご参照ください。

  2. 関連オブジェクトが OSS バケットにアップロードされます。詳細については、「OSS コンソールを使用して開始する」をご参照ください。

  3. IMM がアクティブ化され、IMM プロジェクトが作成されます。詳細については、「IMM をアクティブ化する」および「プロジェクトを作成する」をご参照ください。

説明

CreateProject オペレーションを呼び出してプロジェクトを作成することもできます。詳細については、「CreateProject」をご参照ください。

ListProjects オペレーションを呼び出して、特定のリージョンにある既存のプロジェクトをクエリできます。詳細については、「ListProjects」をご参照ください。

  1. RAM ユーザーに、ライブトランスコーディングを使用するために必要な権限が付与されます。詳細については、「権限」をご参照ください。

  2. OSS バケットは IMM プロジェクトにバインドされています。OSS コンソールまたは IMM API を使用して OSS バケットを IMM プロジェクトにバインドする方法の詳細については、「開始する」および「AttachOSSBucket」をご参照ください。

  3. ソースビデオまたはデスティネーション ビデオを保存するバケットにホットリンク保護が構成されている場合は、Referer フィールドが空のリクエストを許可するホットリンク保護ポリシーがバケットに構成されます。詳細については、「他の Web サイトが OSS オブジェクトにリンクするのを防ぐために Referer ホワイトリストまたはブラックリストを構成する」をご参照ください。

  4. プレーヤーがデスティネーション ビデオを保存するバケットへのクロスオリジン リクエストを開始する必要がある場合は、プレーヤーからのバケットへのクロスオリジン アクセスが許可されていることを確認してください。詳細については、「CORS」をご参照ください。

メディアプレイリストを使用する

トランスコーディング タスク

  • ソースビデオ

    • ビデオ フォーマット:AVI

    • ビデオ URI:oss://your-oss-bucket-name/test.avi

  • デスティネーション ビデオ

    • セグメント時間: 10 秒

    • プリトランスコードされたビデオの長さ: 36 秒

    • ビデオストリーム フォーマット:H.264

    • ビデオ解像度: 1280 × 720

    • フレームレート: 25 fps

    • ビデオ ビットレート: 2 Mbit/s

    • オーディオストリーム フォーマット:AAC

    • オーディオ ビットレート: 128 Kbit/s

    • デスティネーション オブジェクトのパス プレフィックス:oss://your-oss-bucket-name/output/media

ステップ 1:プレイリストを生成する

説明

プレイリストの生成方法の詳細については、「GenerateVideoPlaylist」をご参照ください。

  • サンプルリクエスト

    {
      "ProjectName": "test-project",
      "SourceURI": "oss://your-oss-bucket-name/test.avi",
      "Targets": [
        {
          "Audio": {
            "TranscodeAudio": {
              "Codec": "aac",
              "Bitrate": 128000,
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/media",
          "Video": {
            "TranscodeVideo": {
              "Codec": "h264",
              "Bitrate": 2400000,
              "FrameRate": 25,
              "Resolution": "1280x",
              "ScaleType": "fit"
            }
          }
        }
      ]
    }
  • サンプルレスポンス

    {
      "RequestId": "********-3ADC-576A-BD1E-************",
      "VideoPlaylist": [
        {
          "FrameRate": "25",
          "Resolution": "1280x720",
          "Token": "3d8ca7d6b3**********4b3cb69fe3bf",
          "URI": "oss://your-oss-bucket-name/output/media.m3u8"
        }
      ]
    }
    
  • サンプルコード

    # -*- coding: utf-8 -*-
    
    import json
    
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client(
                access_key_id: str,
                access_key_secret: str,
        ) -> imm20200930Client:
            """
            アカウント Client を初期化するために AccessKey ID と AccessKey シークレットを使用します。
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # AccessKey ID を入力します。
                access_key_id=access_key_id,
                # AccessKey シークレットを入力します。
                access_key_secret=access_key_secret
            )
            # IMM エンドポイントを指定します。
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
    
        @staticmethod
        def main() -> None:
            # AccessKey ID と AccessKey シークレットを入力します。構成から AccessKey ID と AccessKey シークレットを取得することをお勧めします。
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
    
            # プロジェクト名を指定します。
            project_name = "test-project"
    
            # ソースビデオの OSS URI を指定します。
            source_uri = "oss://your-oss-bucket-name/test.avi"
    
            # デスティネーション オブジェクトの URI を指定します。
            target_uri = "oss://your-oss-bucket-name/output/media"
    
            # クライアントを初期化します。
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
    
            # デスティネーション ビデオを作成します。
            target = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=128000,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        bitrate=2400000,
                        frame_rate=25,
                        resolution="1280x",
                        scale_type="fit",
                    )
                ),
            )
    
            # API リクエストを作成します。
            req = imm_20200930_models.GenerateVideoPlaylistRequest(
                project_name=project_name,
                source_uri=source_uri,
                targets=[target]
            )
    
            # リクエストパラメーターと値を出力します。
            print(json.dumps(req.to_map(), indent=4))
    
            # リクエストを開始します。
            response = client.generate_video_playlist(req)
    
            # レスポンスを出力します。
            print(json.dumps(response.body.to_map(), indent=4))
    
    
    if __name__ == '__main__':
        Sample.main()
    
    package main
    
    import (
    	"fmt"
    
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	imm "github.com/alibabacloud-go/imm-20200930/v2/client"
    	"github.com/alibabacloud-go/tea/tea"
    )
    
    func main() {
    	// IMM クライアントを初期化します。
    	immClient, err := imm.NewClient(&openapi.Config{
    		RegionId:        tea.String("cn-hangzhou"),            // プロジェクトが存在するリージョンの ID を指定します。
    		AccessKeyId:     tea.String("your_access_key_id"),     // RAM ユーザーの AccessKey ID を入力します。
    		AccessKeySecret: tea.String("your_access_key_secret"), // RAM ユーザーの AccessKey シークレットを入力します。
    	})
    	if err != nil {
    		// エラーを処理します。
    		panic(err)
    	}
    
    	// プロジェクト名を指定します。
    	projectName := "test-project"
    
    	// ソースビデオの OSS URI を指定します。
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    
    	// デスティネーション オブジェクトの URI を指定します。
    	targetUri := "oss://your-oss-bucket-name/output/media"
    
    	target := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(98304),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(targetUri),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				Bitrate:    tea.Int32(2400000),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1280x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    
    	// API リクエストを作成します。
    	req := &imm.GenerateVideoPlaylistRequest{
    		ProjectName: tea.String(projectName),
    		SourceURI:   tea.String(sourceUri),
    		Targets:     []*imm.GenerateVideoPlaylistRequestTargets{target},
    	}
    
    	// リクエストを開始します。
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    
    	// レスポンスを出力します。
    	fmt.Println("Response:", *res.Body)
    }
    // This file is auto-generated, don't edit it. Thanks.
    package com.aliyun.sample;
    
    import com.aliyun.tea.*;
    
    public class Sample {
    
        /**
         * <b>説明</b> :
         * <p>AccessKey ID と AccessKey シークレットを使用してクライアントを初期化します。</p>
         * @return Client
         * 
         * @throws Exception
         */
        public static com.aliyun.teaopenapi.Client createClient() throws Exception {
            // プロジェクトコードが漏洩した場合、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。次のサンプルコードは参照用にのみ提供されています。
            // セキュリティを強化するために、セキュリティトークンサービス (STS) によって発行された一時的なアクセス認証情報を使用することをお勧めします。詳細については、https://www.alibabacloud.com/help/ja/sdk/developer-reference/v2-manage-access-credentials を参照してください。
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // 必須。ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数が構成されていることを確認してください。
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // 必須。ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // サポートされているリージョンの IMM エンドポイントのリストについては、https://api.alibabacloud.com/product/imm を参照してください。
            config.endpoint = "imm.cn-beijing.aliyuncs.com";
            return new com.aliyun.teaopenapi.Client(config);
        }
    
        /**
         * <b>説明</b> :
         * <p>パラメーターと戻り値</p>
         * 
         * @param path string パス パラメーター
         * @return OpenApi.Params
         */
        public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
            com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
                    // 実行するオペレーション。
                    .setAction("GenerateVideoPlaylist")
                    // オペレーションのバージョン番号。
                    .setVersion("2020-09-30")
                    // プロトコル。
                    .setProtocol("HTTPS")
                    // オペレーションの HTTP メソッド。
                    .setMethod("POST")
                    .setAuthType("AK")
                    .setStyle("RPC")
                    // オペレーションのパス。
                    .setPathname("/")
                    // リクエスト本文のフォーマット。
                    .setReqBodyType("json")
                    // レスポンス本文のフォーマット。
                    .setBodyType("json");
            return params;
        }
    
        public static void main(String[] args_) throws Exception {
            java.util.List<String> args = java.util.Arrays.asList(args_);
            com.aliyun.teaopenapi.Client client = Sample.createClient();
            com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();
            // クエリ パラメーター
            java.util.Map<String, Object> queries = new java.util.HashMap<>();
            queries.put("ProjectName", "test-project");
            queries.put("SourceURI", "oss://your-oss-bucket-name/test.avi");
            queries.put("Targets", "[{\"Video\":{\"TranscodeVideo\":{\"Codec\":\"h264\",\"Bitrate\":128000,\"FrameRate\":25,\"Resolution\":\"1280x\"}},\"Audio\":{\"TranscodeAudio\":{\"SampleRate\":44100,\"Codec\":\"aac\",\"Bitrate\":2400000}},\"Duration\":10,\"InitialSegments\":[2,2,2],\"InitialTranscode\":36,\"URI\":\"oss://your-oss-bucket-name/output/media\"}]");
            // ランタイム オプション
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest()
                    .setQuery(com.aliyun.openapiutil.Client.query(queries));
            // 必要に応じて、オペレーションのレスポンスを表示するコードを記述します。
            // レスポンスは MAP タイプで、レスポンス本文、レスポンスヘッダー、および HTTP ステータスコードが含まれています。
            client.callApi(params, request, runtime);
        }
    }

ステップ 2:プレイリストに署名する

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数を構成する必要があります。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。
endpoint = 'yourEndpoint'
# バケットが配置されているリージョンの ID を指定します。例:cn-hangzhou。
region = 'cn-hangzhou'
# 生成されたプレイリストが保存されているバケットの名前を指定します。
bucket_name = 'your-oss-bucket-name'
# プレイリストの名前を指定します。
key = 'output/media.m3u8'

# バケットインスタンスを指定します。すべてのオブジェクト関連メソッドを呼び出すには、バケットインスタンスを使用する必要があります。
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# x-oss-process オペレーションで hls/sign,live_1 を指定します。
params = {}
params.update({oss2.Bucket.PROCESS: 'hls/sign,live_1'})

# URL に署名します。
url = bucket.sign_url('GET', key, 7200, params=params, slash_safe=True)

# 生成された URL は、HLS プレーヤーで再生するために直接使用できます。
print(url)
# この例では、URL は http://your-oss-bucket-name.yourendpoint/output/media.m3u8?x-oss-process=hls%2Fsign%2Clive_1&x-oss-signature-version=OSS2&x-oss-expires=1683619052&x-oss-access-key-id=yourAccessKeyId&x-oss-signature=4Lja6Sgb7zXWzY9R9QTRe4FxI240fApDavp%2BSMj3ufg%3D です。
package main

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"net/http"
	"net/url"
	"os"
	"strings"
)

func main() {
	// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、環境変数を構成する必要があります。
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// OSSClient インスタンスを作成します。
	// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
	// バケットが配置されているリージョンのエンドポイントを指定します。
	client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("yourRegion"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// バケットの名前を指定します。この例では、バケット名は your-oss-bucket-name です。
	bucket, err := client.Bucket("your-oss-bucket-name")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// hls/sign を使用してプレイリストに署名します。"hls/sign,live_1" 文字列はライブトランスコーディングを指定します。
	// M3U8 オブジェクトのフルパスを指定します。この例では、パスは output/media.m3u8 です。
	// 署名の有効期間を指定します。この例では、有効期間は 7,200 秒 ( 2 時間) に設定されています。
	signedURL, err := bucket.SignURL("output/media.m3u8", http.MethodGet, 7200, oss.Process("hls/sign,live_1"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}

	// URL をビデオプレーヤーがビデオ再生に使用できる URL に変換します。
	rawUrl, err := url.Parse(signedURL)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	rawUrl.RawPath = strings.Replace(rawUrl.RawPath, "%2F", "/", -1)

	// 署名付き URL を出力します。
	fmt.Println(rawUrl.String())

	// 署名付き URL は、HLS プレーヤーで再生するために直接使用できます。
	//http://your-oss-bucket-name.yourEndpoint/output/media.m3u8?x-oss-access-key-id=yourAccessKeyId&x-oss-expires=1683618084&x-oss-process=hls%2Fsign%2Clive_1&x-oss-signature=%2BqTZ0R04Ft065gdyoP6f9yJdd1UXi%2F8eoxd9c9Stl2g%3D&x-oss-signature-version=OSS2

}
package com.aliyun.sample;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.Date;
public class demo {
    public static void main(String[] args) throws Throwable {
        // この例では、中国 (北京) リージョンのエンドポイントが使用されています。実際のエンドポイントを指定してください。
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        String region = "cn-beijing";
        // 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // 必須。ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数が構成されていることを確認してください。
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // 必須。ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が構成されていることを確認してください。
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。例:examplebucket。
        String bucketName = "test-project";
        // オブジェクトのフルパスを指定します。例:exampleobject.txt。オブジェクトのフルパスにバケット名を含めないでください。
        String objectKey = "output/media.m3u8";
        // OSSClient インスタンスを作成します。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
        // URL の有効期間を指定します。
        Date expiration = new Date(new Date().getTime() + 7200 * 1000); // この例では、有効期間は 2 時間に設定されています。
        GeneratePresignedUrlRequest request=new GeneratePresignedUrlRequest(bucketName, objectKey, HttpMethod.GET);
        request.setExpiration(expiration);
        request.setProcess("hls/sign,live_1");
        // 署名付き URL を生成します。
        URL signedUrl = ossClient.generatePresignedUrl(request);

        // 署名付き URL を表示します。
        System.out.println(signedUrl);
        // クライアントをシャットダウンします。


        // OSSClient インスタンスをシャットダウンします。
        ossClient.shutdown();         
        try {
            // 署名付き URL の有効期間を指定します。単位:ミリ秒。この例では、有効期間は 1 時間に設定されています。
            URL url = ossClient.generatePresignedUrl(bucketName, objectKey, expiration);
            System.out.println(url);
        } catch (OSSException oe) {
            System.out.println("OSSException が発生しました。これは、リクエストが OSS に到達しましたが、何らかの理由でエラーレスポンスで拒否されたことを意味します。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエスト ID:" + oe.getRequestId());
            System.out.println("ホスト ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("ClientException が発生しました。これは、クライアントが OSS と通信しようとしているときに、ネットワークにアクセスできないなど、重大な内部問題が発生したことを意味します。");
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

ステップ 3:ビデオを再生する

ステップ 2:プレイリストに署名する で生成された署名付き URL を HLS プレーヤーで直接使用して、ビデオを再生できます。

  • Mac の Safari でビデオを再生する

    Mac の Safari プレーヤーは HLS 再生をサポートしています。署名付き URL をコピーして Safari のアドレスバーに貼り付けると、ビデオを再生できます。

  • Web 用 ApsaraVideo Player でビデオを再生する

    [Web 用 ApsaraVideo Player] を開きます。署名付き URL をコピーして [URL] フィールドに貼り付けます。

    説明

    アプリケーションに ApsaraVideo Player SDK を統合して、アプリケーションでビデオを直接再生することもできます。詳細については、「概要」をご参照ください。

    image

  • 別の HLS 互換プレーヤーでビデオを再生する

    署名付き URL をコピーしてプレーヤーに貼り付けると、ビデオを再生できます。

マスタープレイリストを使用する

トランスコーディング タスク

  • ソースビデオ

    • ビデオ フォーマット:AVI

    • ビデオ URI:oss://your-oss-bucket-name/test.avi

  • マスタープレイリスト URI:oss://your-oss-bucket-name/output/master.m3u8

  • デスティネーション ビデオ 1

    • セグメント時間: 10 秒

    • プリトランスコードされたビデオの長さ: 36 秒

    • ビデオストリーム フォーマット:H.264

    • ビデオ解像度: 1920 × 1080

    • フレームレート: 25 fps

    • オーディオストリーム フォーマット:AAC

    • オーディオ ビットレート: 128 Kbit/s

    • デスティネーション オブジェクトのパス プレフィックス:oss://your-oss-bucket-name/output/1080p/1080p

  • デスティネーション ビデオ 2

    • セグメント時間: 10 秒

    • プリトランスコードされたビデオの長さ: 36 秒

    • ビデオストリーム フォーマット:H.264

    • ビデオ解像度: 1280 × 720

    • フレームレート: 25 fps

    • オーディオストリーム フォーマット:AAC

    • オーディオ ビットレート: 96 Kbit/s

    • デスティネーション オブジェクトのパス プレフィックス:oss://your-oss-bucket-name/output/720p/720p

  • デスティネーション ビデオ 3

    • セグメント時間: 10 秒

    • プリトランスコードされたビデオの長さ: 36 秒

    • ビデオストリーム フォーマット:H.264

    • ビデオ解像度: 720 × 540

    • フレームレート: 25 fps

    • オーディオストリーム フォーマット:AAC

    • オーディオ ビットレート: 64 Kbit/s

    • デスティネーション オブジェクトのパス プレフィックス:oss://your-oss-bucket-name/output/540p/540p

ステップ 1:プレイリストを生成する

  • サンプルリクエスト

    {
      "MasterURI": "oss://your-oss-bucket-name/output/master.m3u8",
      "ProjectName": "test-project",
      "SourceSubtitles": [],
      "SourceURI": "oss://your-oss-bucket-name/test.avi",
      "Targets": [
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 131072,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/1080p/1080p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "1920x",
              "ScaleType": "fit"
            }
          }
        },
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 98304,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/720p/720p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "1280x",
              "ScaleType": "fit"
            }
          }
        },
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 65536,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/540p/540p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "720x",
              "ScaleType": "fit"
            }
          }
        }
      ]
    }
    
  • サンプルレスポンス

    {
      "Duration": 60.085,
      "MasterURI": "oss://your-oss-bucket-name/output/master.m3u8",
      "RequestId": "********-3ADC-576A-BD1E-************",
      "Token": "1deb790e****************231a6f9d",
      "VideoPlaylist": [
        {
          "FrameRate": "25",
          "Resolution": "720x406",
          "Token": "8bcd9bc0****************67a65f48",
          "URI": "oss://your-oss-bucket-name/output/540p/540p.m3u8"
        },
        {
          "FrameRate": "25",
          "Resolution": "1280x720",
          "Token": "89ca4337****************cd031957",
          "URI": "oss://your-oss-bucket-name/output/720p/720p.m3u8"
        },
        {
          "FrameRate": "25",
          "Resolution": "1920x1080",
          "Token": "11fb1afb****************4f3683fc",
          "URI": "oss://your-oss-bucket-name/output/1080p/1080p.m3u8"
        }
      ]
    }
  • サンプルコード

    # -*- coding: utf-8 -*-
    
    import json
    
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    
    
    class Sample:
        def __init__(self):
            pass
    
        @staticmethod
        def create_client(
                access_key_id: str,
                access_key_secret: str,
        ) -> imm20200930Client:
            """
            アカウント Client を初期化するために AccessKey ID と AccessKey シークレットを使用します。
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # AccessKey ID を入力します。
                access_key_id=access_key_id,
                # AccessKey シークレットを入力します。
                access_key_secret=access_key_secret
            )
            # IMM エンドポイントを指定します。
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
    
        @staticmethod
        def main() -> None:
            # AccessKey ID と AccessKey シークレットを入力します。構成から AccessKey ID と AccessKey シークレットを取得することをお勧めします。
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
    
            # プロジェクト名を指定します。
            project_name = "test-project"
    
            # ソースビデオの OSS URI を指定します。
            source_uri = "oss://your-oss-bucket-name/test.avi"
    
            # デスティネーション オブジェクトの URI を指定します。
            target_uri_prefix = "oss://your-oss-bucket-name/output"
            master_uri = f"{target_uri_prefix}/master.m3u8"
            target_1080p_uri = f"{target_uri_prefix}/1080p/1080p"
            target_720p_uri = f"{target_uri_prefix}/720p/720p"
            target_540p_uri = f"{target_uri_prefix}/540p/540p"
    
            # クライアントを初期化します。
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
    
            # 1080p ビデオを作成します。
            target_1080p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=131072,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_1080p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="1920x",
                        scale_type="fit",
                    )
                ),
            )
    
            # 720p ビデオを作成します。
            target_720p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=98304,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_720p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="1280x",
                        scale_type="fit",
                    )
                ),
            )
    
            # 540p ビデオを作成します。
            target_540p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=65536,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_540p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="720x",
                        scale_type="fit",
                    )
                ),
            )
    
            # API リクエストを作成します。
            req = imm_20200930_models.GenerateVideoPlaylistRequest(
                project_name=project_name,
                source_uri=source_uri,
                master_uri=master_uri,
                targets=[target_1080p, target_720p, target_540p]
            )
    
            # リクエストパラメーターと値を出力します。
            print(json.dumps(req.to_map(), indent=4))
    
            # リクエストを開始します。
            response = client.generate_video_playlist(req)
    
            # レスポンスを出力します。
            print(json.dumps(response.body.to_map(), indent=4))
    
    
    if __name__ == '__main__':
        Sample.main()
    
    package main
    
    import (
    	"fmt"
    
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	imm "github.com/alibabacloud-go/imm-20200930/v2/client"
    	"github.com/alibabacloud-go/tea/tea"
    )
    
    func main() {
    	// IMM クライアントを初期化します。
    	immClient, err := imm.NewClient(&openapi.Config{
    		RegionId:        tea.String("cn-hangzhou"),            // プロジェクトが存在するリージョンの ID を指定します。
    		AccessKeyId:     tea.String("your_access_key_id"),     // RAM ユーザーの AccessKey ID を入力します。
    		AccessKeySecret: tea.String("your_access_key_secret"), // RAM ユーザーの AccessKey シークレットを入力します。
    	})
    	if err != nil {
    		// エラーを処理します。
    		panic(err)
    	}
    
    	// プロジェクト名を指定します。
    	projectName := "test-project"
    
    	// ソースビデオの OSS URI を指定します。
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    
    	// デスティネーション オブジェクトの URI を指定します。
    	targetURIPrefix := "oss://your-oss-bucket-name/output"
    	masterURI := targetURIPrefix + "/master.m3u8"
    	target1080pURI := targetURIPrefix + "/1080p/1080p"
    	target720pURI := targetURIPrefix + "/720p/720p"
    	target540pURI := targetURIPrefix + "/540p/540p"
    
    	target1080p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(131072),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target1080pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1920x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    
    	target720p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(98304),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target720pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1280x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    
    	target540p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(65536),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target540pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("720x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    
    	// API リクエストを作成します。
    	req := &imm.GenerateVideoPlaylistRequest{
    		ProjectName: tea.String(projectName),
    		SourceURI:   tea.String(sourceUri),
    		MasterURI:   tea.String(masterURI),
    		Targets:     []*imm.GenerateVideoPlaylistRequestTargets{target1080p, target720p, target540p},
    	}
    
    	// リクエストを開始します。
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    
    	// レスポンスを出力します。
    	fmt.Println("Response:", *res.Body)
    }
    

ステップ 2:プレイリストに署名する

メディアプレイリストに署名するのと同じ方法で、マスタープレイリストに署名します。詳細については、「ステップ 2:プレイリストに署名する」をご参照ください。

ステップ 3:ビデオを再生する

ビデオを再生する方法の詳細については、「ステップ 3:ビデオを再生する」をご参照ください。

FAQ

ライブトランスコーディングを使用してトランスコードされたビデオを再生するには、カスタムプレーヤーが必要ですか?

いいえ、必要ありません。ライブトランスコーディングは HLS プロトコルをサポートしています。[Web 用 ApsaraVideo Player] や Safari など、HLS 互換のビデオプレーヤーとブラウザを使用して、ライブトランスコーディングでトランスコードされたビデオを再生できます。

ライブトランスコーディングではどのようなデスティネーション オブジェクトが生成されますか?

ライブトランスコーディングでは、指定されたパスに M3U8 オブジェクトと TS オブジェクトが生成されます。M3U8 オブジェクトはすぐに生成されます。

プリトランスコーディングの長さを指定した場合、TS オブジェクトは指定された長さに対して非同期的に生成され、プリトランスコーディングが指定されていない部分に対して非同期オンデマンド トランスコーディングがトリガーされます。ビデオが再生されたことがない場合、プリトランスコーディングの対象外のビデオ部分に対して TS オブジェクトは生成されません。たとえば、 15 分目からビデオを再生する場合、トランスコーディングも 15 分目から開始されます。次のコンテンツは、出力オブジェクトの例を示しています。

.
├── outobjprefix.m3u8
├── outobjprefix-c280f054328fcde47c1732a8f2915009-0.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-1.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-2.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-3.ts

TS オブジェクトが削除されたビデオを再生できますか?

はい、一部またはすべての TS オブジェクトが削除されていても、ビデオを再生できます。ただし、ビデオと M3U8 オブジェクトが削除されていないことを確認してください。これは、M3U8 プレイリストのリクエストによって TS オブジェクトの再生成がトリガーされるためです。このメカニズムにより、長時間視聴されていないビデオ用に生成された TS オブジェクトを削除して、将来の再生パフォーマンスに影響を与えることなくストレージ コストを削減できます。

ライブトランスコーディングは、ライブトランスコーディングから作成されていない M3U8 プレイリストをサポートしていますか?

いいえ、ライブトランスコーディングは、ライブトランスコーディングから作成されていない M3U8 プレイリストをサポートしていません。

Alibaba Cloud CDN を使用してライブトランスコーディングを高速化できますか?

はい、できます。詳細については、「Alibaba Cloud CDN とライブトランスコーディングを併用してビデオ再生を高速化する」をご参照ください。