ビデオトランスコーディングを使用すると、コーディング形式の変更、解像度とビットレートの調整、コンテナフォーマットの変更、およびビデオパラメーターの変更を行い、さまざまなビジネス要件を満たすことができます
機能概要
ビデオトランスコーディングは、圧縮されたビデオストリームを別のフォーマットに変換するプロセスであり、ビデオフォーマット、コンテナフォーマット、解像度、フレームレート、ビットレートなどの要素を調整します。これにより、さまざまなデバイスやプラットフォームでの再生の互換性を確保し、ファイルサイズを削減して伝送効率を向上させます。

シナリオ
クロスデバイス互換性: 携帯電話、タブレット、コンピューター、スマート TV などのさまざまなデバイスでビデオをスムーズに再生するために、トランスコーディング技術を使用して、ビデオを各特定のデバイスと互換性のあるフォーマットに変換できます。
ストリーミングメディア再生: ストリーミングサービスは、ユーザーのネットワーク状態に動的に適応するために、ビデオを複数のフォーマットとビットレートにトランスコードして、全体的な視聴体験を向上させる必要があります。
ビデオ圧縮: ビデオトランスコーディングは、ビデオ品質を維持しながらファイルサイズを削減できるため、特にネットワーク帯域幅が限られている環境での保存と送信が容易になります。
データアーカイブ: トランスコーディングは、高品質のビデオを最適化されたフォーマットに変換し、効率的な長期保存と管理を実現し、ストレージ要件を最小限に抑えます。
解像度適応: トランスコーディングは、ビデオ解像度を下げて、さまざまな再生デバイスとネットワーク状態をサポートし、よりスムーズな再生体験を保証します。
ビデオフォーマットの互換性: トランスコーディングは、あまり一般的でないビデオフォーマットを広く採用されているフォーマットに変換し、メディア再生ソフトウェアとの互換性を確保し、より広いアクセシビリティを可能にします。
使用方法
前提条件
Intelligent Media Management (IMM) が有効化されていること。 詳細については、「IMM を有効化する」をご参照ください。
対応する Object Storage Service (OSS) バケットが IMM プロジェクトにバインドされていること。
OSS コンソールでのバインドに関する詳細については、「開始する」をご参照ください。
IMM API を使用したバインドに関する詳細については、「AttachOSSBucket」をご参照ください。
IMM 機能を使用するために使用する Resource Access Management (RAM) ユーザーに必要な権限が付与されていること。 詳細については、「権限」をご参照ください。
OSS SDK の使用
ビデオトランスコーディングは非同期です。 サポートされているすべての言語の OSS SDK のうち、この機能をサポートしているのは Java、Python、Go SDK のみです。
Java
OSS SDK for Java 3.17.4 以降が必要です。
import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.AsyncProcessObjectRequest;
import com.aliyun.oss.model.AsyncProcessObjectResult;
import com.aliyuncs.exceptions.ClientException;
import java.util.Base64;
public class Demo {
public static void main(String[] args) throws ClientException {
// バケットが配置されているリージョンのエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットが配置されている Alibaba Cloud リージョンの ID を指定します。 例: cn-hangzhou。
String region = "cn-hangzhou";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。 例: examplebucket。
String bucketName = "examplebucket";
// 出力ビデオの名前を指定します。
String targetKey = "dest.avi";
// ソースビデオの名前を指定します。
String sourceKey = "src.mp4";
// 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 {
// 文字列型のスタイル変数を作成して、ビデオトランスコーディングパラメーターを格納します。
String style = String.format("video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1");
// 非同期処理命令を作成します。
String bucketEncoded = Base64.getUrlEncoder().withoutPadding().encodeToString(bucketName.getBytes());
String targetEncoded = Base64.getUrlEncoder().withoutPadding().encodeToString(targetKey.getBytes());
String process = String.format("%s|sys/saveas,b_%s,o_%s", style, bucketEncoded, targetEncoded);
// AsyncProcessObjectRequest オブジェクトを作成します。
AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, sourceKey, process);
// 非同期処理タスクを実行します。
AsyncProcessObjectResult response = ossClient.asyncProcessObject(request);
System.out.println("EventId: " + response.getEventId());
System.out.println("RequestId: " + response.getRequestId());
System.out.println("TaskId: " + response.getTaskId());
} finally {
// OSSClient インスタンスをシャットダウンします。
ossClient.shutdown();
}
}
}Python
OSS SDK for Python V2.18.4 以降が必要です。
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# バケットが配置されているリージョンのエンドポイントを指定します。
# たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# 環境変数からアクセス資格情報を取得します。
# サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットの名前を指定します。
bucket_name = 'examplebucket'
# バケットが配置されている Alibaba Cloud リージョンの ID を指定します。 例: cn-hangzhou。
region = 'cn-hangzhou'
# バケットを作成します。
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# ソースビデオの名前を指定します。
source_key = 'src.mp4'
# 出力ビデオの名前を指定します。
target_key = 'dest.avi'
# 文字列型のスタイル変数を作成して、ビデオトランスコーディングパラメーターを格納します。
style = 'video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1'
process = "{0}|sys/saveas,o_{1}".format(style,
oss2.compat.to_string(base64.urlsafe_b64encode(
oss2.compat.to_bytes(target_key))).replace('=', ''))
# メディア処理操作を呼び出します。
try:
# 非同期処理タスクを実行します。
result = bucket.async_process_object(source_key, process)
print(f"EventId: {result.event_id}")
print(f"RequestId: {result.request_id}")
print(f"TaskId: {result.task_id}")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
main()
Go
OSS SDK for Go V3.0.2 以降が必要です。
package main
import (
"encoding/base64"
"fmt"
"os"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス資格情報を取得します。
// サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
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("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("cn-hangzhou"))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// ソースビデオが格納されているバケットの名前を指定します。 例: examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
// 出力ビデオの名前を指定します。
targetObject := "dest.avi"
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// ソースビデオの名前を指定します。
sourceObject := "src.mp4"
// 文字列型のスタイル変数を作成して、ビデオトランスコーディングパラメーターを格納します。
style := "video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1"
process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v", style, strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(bucketName)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetObject)), "="))
fmt.Printf("%#v\n", process)
rs, err := bucket.AsyncProcessObject(sourceObject, process)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("EventId:%s\n", rs.EventId)
fmt.Printf("RequestId:%s\n", rs.RequestId)
fmt.Printf("TaskId:%s\n", rs.TaskId)
}
パラメーター
アクション: video/convert
次の表に、ビデオトランスコーディングのパラメーターを示します。
パラメーター | タイプ | 必須 | 説明 |
ss | int | いいえ | トランスコーディングを開始するビデオの開始時刻。 単位: ミリ秒。 有効な値:
|
t | int | いいえ | 指定された開始時刻以降にトランスコードされるビデオコンテンツの期間。 単位: ミリ秒。 有効な値:
|
f | string | はい | メディアコンテナーのタイプ。
|
vn | int | いいえ | ビデオストリームの生成を無効にするかどうかを指定します。 有効な値:
|
vcodec | string | いいえ | 出力ビデオのエンコード形式。 有効な値:
|
fps | float | いいえ | ビデオフレームレート。 有効な値: 0~240。 |
fpsopt | int | いいえ | フレームレートオプション。 有効な値:
|
pixfmt | string | いいえ | ターゲットピクセルフォーマット。 デフォルトでは、ターゲットピクセルフォーマットはソースピクセルフォーマットと同じです。 有効な値:
|
s | string | いいえ | 目的の解像度。
|
sopt | int | いいえ | 解像度オプション。 有効な値:
|
scaletype | string | いいえ | サイズ変更モード。 有効な値:
|
arotate | int | いいえ | アダプティブ解像度の向きを有効にするかどうかを指定します。 有効な値:
|
g | int | いいえ | キーフレーム間隔。 有効な値: 1~100000。 |
vb | int | いいえ | ターゲットビデオビットレート。 単位: bit/s。 有効な値: 10000~100000000。 |
vbopt | int | いいえ | ビデオビットレートオプション。 有効な値:
|
crf | float | いいえ | 固定レート係数 (CRF)。 有効な値: 0~51。 |
maxrate | int | いいえ | 最大ビットレート。 単位: bit/s。 有効な値: 10000~100000000。 |
bufsize | int | いいえ | バッファーサイズ。 単位: bit。 有効な値: 10000~200000000。 |
an | int | いいえ | オーディオストリームの生成を無効にするかどうかを指定します。 有効な値:
|
acodec | string | いいえ | オーディオのエンコード形式。 有効な値:
|
ar | int | いいえ | 音声サンプリングレート。 有効な値:
|
ac | int | いいえ | 出力オーディオのサウンドチャンネル数。 デフォルトでは、出力オーディオはソースオーディオと同じチャンネル数を保持します。 有効な値: 1~8。 |
aq | int | いいえ | オーディオ圧縮品質。 このパラメーターと ab パラメーターは相互排他です。 有効な値: 0~100。 |
ab | int | いいえ | オーディオビットレート。 このパラメーターと [aq] パラメーターは相互排他です。 単位: bit/s。 有効な値: 1000~10000000。 |
abopt | int | いいえ | オーディオビットレートオプション。 有効な値:
|
sn | int | いいえ | 字幕の生成を無効にするかどうかを指定します。 有効な値:
|
adepth | int | いいえ | 出力オーディオのサンプリングビット深度。 有効な値: 16 および 24。 説明 このパラメーターは、acodec パラメーターを flac に設定した場合にのみ有効になります。 |
segment | string | いいえ | メディアセグメンテーション設定。 デフォルトでは、セグメンテーションは実行されません。 |
f | string | いいえ | メディアセグメンテーションモード。 有効な値:
親ノード: segment |
t | int | いいえ | セグメントの長さ。 単位: ミリ秒。 有効な値: 0~3600000。 親ノード: segment |
ビデオトランスコーディングタスクでは、sys/saveas および notify パラメーターを使用する必要がある場合もあります。 詳細については、「sys/saveas」および「メッセージ通知」をご参照ください。
OSS API の使用
ビジネスで高度なカスタマイズが必要な場合は、RESTful API を直接呼び出すことができます。 RESTful API を直接呼び出すには、署名計算をコードに含める必要があります。 Authorization ヘッダーの署名を計算する方法の詳細については、「(推奨) V4 署名を含める」をご参照ください。
AVI から MP4 への変換
トランスコーディングタスク情報
ソースオブジェクト
ビデオフォーマット: AVI
ビデオ名: example.avi
処理メソッド: ビデオトランスコーディング
宛先オブジェクト
ビデオ情報
ビデオフォーマット: MP4
ビデオ名: outobjprefix.mp4
ビデオストリームフォーマット: H.265
ビデオ解像度: 1920×1080
ビデオフレームレート: 30 fps
ビデオビットレート: 2 Mbit/s
オーディオ情報
オーディオストリームフォーマット: AAC
オーディオビットレート: 100 Kbit/s
字幕ストリーム: 無効
出力パス: oss://outbucket/outobjprefix.mp4
リクエストの例
POST /example.avi?x-oss-async-process HTTP/1.1
Host: video-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: SignatureValue
// example.avi オブジェクトを MP4 コンテナフォーマットにトランスコードし、ビデオストリームフォーマットとして H.265 を指定します。
// 解像度を 1920 x 1080、フレームレートを 30 fps、ビデオビットレートを 2 Mbit/s に設定します。 オーディオストリームフォーマットとして AAC を指定し、オーディオビットレートを 100 Kbit/s に設定します。 字幕ストリームの生成を無効にします。 出力オブジェクトを oss://outbucket/outobjprefix.mp4 として保存します。
x-oss-async-process=video/convert,f_mp4,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQAVI から TS への変換
トランスコーディングタスク情報
ソースオブジェクト
ビデオフォーマット: AVI
ビデオ名: example.avi
処理タスクの詳細
トランスコーディングの長さ: ビデオの 1,000 ミリ秒目から開始して、ビデオの 60,000 ミリ秒をトランスコードします。
セグメントメソッド: 30 秒間隔で HTTP Live Steaming (HLS) セグメントを作成します。
トランスコーディング完了通知: Simple Message Queue (SMQ) メッセージを送信します。
宛先オブジェクト
ビデオ情報
ビデオフォーマット: TS
ビデオストリームフォーマット: H.264
ビデオビットレート: 1 Mbit/s
オーディオ情報
オーディオフォーマット: AAC
オーディオビットレート: 100 Kbit/s
出力パス
TS オブジェクト: oss://outbucket/outobjprefix-%d.ts
M3U8 オブジェクト: oss://outbucket/outobjprefix.m3u8
リクエストの例
POST /example.avi?x-oss-async-process HTTP/1.1
Host: video-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: SignatureValue
// example.avi ビデオをトランスコードします。
x-oss-async-process=video/convert,ss_10000,t_60000,f_ts,vcodec_h264,vb_1000000,acodec_mp3,ab_100000/segment,f_hls,t_30000|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ/notify,topic_QXVkaW9Db252ZXJ0AVI から MP3 への変換
トランスコーディングタスク情報
ソースオブジェクト
ビデオ名: example.avi
ビデオフォーマット: AVI
処理メソッド: オーディオを抽出してトランスコードします。
宛先オブジェクト
オーディオコンテナフォーマット: MP3
オーディオコーディングフォーマット: MP3
オーディオビットレート: 100 Kbit/s
ビデオストリーム: 無効
字幕ストリーム: 無効
出力パス: oss://outbucket/outobjprefix.mp3 (ビデオに複数のオーディオチャンネルが含まれている場合、デフォルトでは最初のチャンネルのみが処理されます。)
リクエストの例
POST /example.avi?x-oss-async-process HTTP/1.1
Host: video-demo.oss-cn-hangzhou.aliyuncs.com
Date: Fri, 28 Oct 2022 06:40:10 GMT
Authorization: SignatureValue
// example.avi オブジェクトからオーディオを抽出し、抽出したオーディオをトランスコードします。
x-oss-async-process=video/convert,f_mp3,acodec_mp3,ab_100000,vn_1,sn_1|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ注意事項
ビデオトランスコーディングは非同期処理 (x-oss-async-process) のみをサポートします。
ビデオトランスコーディングは匿名アクセスをサポートしていません。
ビデオトランスコーディングは、MP4、MPEG-TS、MKV、MOV、AVI、FLV、M3U8、WebM、WMV、RM、および VOB のビデオフォーマットをサポートしています。
ビデオトランスコーディングに video/convert を使用すると料金が発生します。 メディア処理の料金は IMM の請求書に含まれます。 詳細については、「課金項目」をご参照ください。
よくある質問
ビデオトランスコーディングタスクの ResourceNotFound エラーを修正するにはどうすればよいですか?
ビデオトランスコーディング中に 「ResourceNotFound, The specified resource Attachment is not found.」 エラーを修正するには、バケットが作成され、IMM プロジェクトにバインドされていることを確認してください。 詳細については、「ステップ 2: OSS バケットをバインドする」をご参照ください。
ビデオトランスコーディングタスクの出力オブジェクトをソースオブジェクトのパスに保存できますか?
いいえ、ビデオトランスコーディングタスクの出力オブジェクトをソースオブジェクトと同じパスに保存することはできません。 トリガーの実行ループやソースオブジェクトの偶発的な上書きなどの問題を回避するため、入力パスを出力パスのプレフィックスとして使用しないでください。
ビデオトランスコーディングタスクでオーディオビット深度を指定できますか?
はい、x-oss-process に pixfmt パラメーターを含めることで、ビデオトランスコーディングタスクでオーディオビット深度を指定できます。
返されたタスク ID を使用して、ビデオトランスコーディングのタスク実行結果を取得するにはどうすればよいですか?
返されたタスク ID を使用してビデオトランスコーディングのタスク実行結果を取得するには、IMM で GetTask 操作を呼び出すことをお勧めします。
OSS は、ビデオトランスコーディング中にサフィックスに基づいて特定のフォーマットのオブジェクトの取得と削除をどのように処理しますか?
OSS は順序付けられていないストレージサービスを提供するため、サフィックスによるオブジェクトの検索をサポートしていません。
ビデオトランスコーディングのメッセージプッシュが設定されているのに、バックエンドがメッセージを受信しない場合はどうすればよいですか?
SMQ トピックが作成され、サブスクリプションが設定されているかどうかを確認します。 SMQ トピックが存在しないか削除されている場合は、サブスクリプションを再設定します。 現在のサブスクリプション設定に基づいてトランスコーディングプロセスを再開します。
ビデオを OSS にアップロードした後、特定のテンプレートを使用してビデオをトランスコードできますか?
はい、トリガーを設定してこの機能を実装できます。 ビデオ処理タスクは、手動で開始することも、バッチプロセッサ (既存のデータ用) とトリガー (増分データ用) を使用して自動的に開始することもできます。 タスク、バッチプロセッサ、またはトリガーを作成するときに、システムスタイルまたはカスタムスタイルを使用できます。 詳細については、「バッチ処理」および「トリガー」をご参照ください。
ビデオトランスコーディングタスクで出力ビデオのストレージに料金はかかりますか? 出力ビデオのプレフィックスがソースビデオと異なる場合、出力ビデオはソースビデオを置き換えますか?
出力ビデオはストレージ領域を消費するため、関連する料金が発生します。 トランスコードされたビデオとソースビデオの両方に同じパスを使用すると、ループの問題が発生する可能性があります。