ビデオトランスコーディングを使用して、エンコード形式の変更、解像度とビットレートの削減、コンテナフォーマットの変換、ビデオパラメーターの変更を行い、さまざまなビジネス要件に対応できます。このトピックでは、ビデオトランスコーディングパラメーターの設定方法と、ビデオトランスコーディングの例について説明します。
利用シーン
さまざまな端末デバイスとネットワーク環境への適応
メディアファイルの解像度とビットレートを変更して、さまざまな端末デバイスやネットワーク環境への適応性を確保できます。
効率的なエンコーディングによるコスト削減
メディア処理で効率的なエンコーディングアルゴリズムを使用することで、ビデオ品質を損なうことなくビットレートを削減し、再生中のカクつきを減らすことができます。これにより、ストレージとトラフィックのコストを節約できます。
ビデオのエンハンスメントと再生成のためのスマートプロダクション技術
ビデオ AI や超解像技術などのメディア処理技術や高度なプロダクション技術を活用して、低品質のビデオをより高解像度のバージョンにトランスコードしたり、ウォーターマークの追加、ビデオフレームのキャプチャ、編集を行って新しいメディアファイルを作成したりできます。
前提条件
Intelligent Media Management (IMM) が有効化されていること。詳細については、「IMM の有効化」をご参照ください。
対応する Object Storage Service (OSS) バケットが IMM プロジェクトにバインドされていること。OSS コンソールで OSS バケットを IMM プロジェクトにバインドする方法については、「クイックスタート」をご参照ください。IMM API を使用してバケットを IMM プロジェクトにバインドする方法については、「AttachOSSBucket」をご参照ください。
IMM の機能を使用するために、使用する Resource Access Management (RAM) ユーザーに必要な権限が付与されていること。詳細については、「権限」をご参照ください。
注意事項
ビデオトランスコーディングは、非同期処理 (`x-oss-async-process`) のみをサポートします。
ビデオトランスコーディングは、匿名アクセスをサポートしていません。
ビデオトランスコーディングは、MP4、MPEG-TS、MKV、MOV、AVI、FLV、M3U8、WebM、WMV、RM、VOB のビデオフォーマットをサポートしています。
ビデオトランスコーディングの使用には料金が発生します。メディア処理の料金は、IMM の請求に含まれます。詳細については、「課金項目」をご参照ください。
プロセス
以下の図は、ビデオトランスコーディングのプロセスを示しています。
ビデオファイルをバケットにアップロードします。
メディアトランスコーディングタスクを作成します。
メディアトランスコーディングタスクが実行された後、トランスコードされたビデオファイルを OSS に保存します。
パラメーター
アクション: 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 パラメーターは相互排他的です。有効値: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 の使用
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, 旧 MNS) メッセージを送信します。
宛先オブジェクト
ビデオ情報
ビデオフォーマット: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_b3V0b2JqcHJlZml4LnthdXRvZXh0fQOSS SDK の使用
Java、Python、または Go 用の OSS SDK を使用して、非同期モードでビデオをトランスコードできます。
Java
Java 用 OSS SDK を使用する場合は、SDK のバージョンが V3.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 インスタンスを作成します。
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
Python 用 OSS SDK を使用する場合は、SDK のバージョンが 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
Go 用 OSS SDK を使用する場合は、SDK のバージョンが 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)
}
よくある質問
ビデオトランスコーディングタスクで 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 にアップロードした後、特定のテンプレートを使用してビデオをトランスコードできますか?
はい、できます。トリガーを設定してこの機能を実現できます。バケット内の既存および新規のビデオに対して、バッチ処理設定とトリガーを使用してビデオ処理タスクを手動または自動で開始できます。タスク、バッチプロセッサ、またはトリガーを作成する際に、システムスタイルまたはカスタムスタイルを使用できます。詳細については、「バッチ処理」および「トリガー」をご参照ください。
トランスコードされたビデオとソースビデオの両方にストレージ料金はかかりますか?トランスコードされたビデオのプレフィックスがソースビデオと異なる場合、トランスコードされたビデオはソースビデオを置き換えますか?
はい、トランスコードされたビデオとソースビデオの両方にストレージ料金がかかります。これは、トランスコードされたビデオもストレージスペースを消費するためです。トランスコードされたビデオとソースビデオに同じパスを使用すると、ループが発生する可能性があります。