ビデオ情報の抽出機能を使用すると、メディアファイルからカプセル化の詳細とオーディオおよびビデオストリームを取得できます。抽出されたビデオ情報には、ビデオの解像度、フレームレート、オーディオおよびビデオコーデック、再生時間、作成時間、画像の幅と高さ、字幕ストリームの存在が含まれます。
シナリオ
ビデオ監視:セキュリティ監視システムでビデオ情報の抽出を使用して、人物、車両、またはその他のオブジェクトの動きと異常な活動を識別および追跡します。
ビデオ検索:ビデオから視覚的特徴またはラベルを抽出して、対象のビデオコンテンツを効率的に取得できるようにします。
ビデオ編集:キーフレーム、オーディオクリップ、字幕を自動的に識別して抽出し、ビデオの編集と制作を容易にします。
ビデオ管理:解像度、ビットレート、フレームレート、コーディングなどのメディアメタデータに基づいて、メディアファイルを分類、管理、使用します。
使用方法
前提条件
Intelligent Media Management (IMM) がアクティブ化されていること。詳細については、「IMM のアクティブ化」をご参照ください。
検出するビデオを含む Object Storage Service (OSS) バケットが IMM プロジェクトにバインドされていること。OSS コンソールまたは IMM API を使用して、バケットを IMM プロジェクトにバインドできます。
OSS コンソールでバケットを IMM プロジェクトにバインドする方法については、「はじめに」をご参照ください。
IMM API を使用してバケットを IMM プロジェクトにバインドする方法については、「AttachOSSBucket」をご参照ください。
必要な権限が付与されていること。詳細については、「権限」をご参照ください。
OSS SDK の使用
次のサンプルコードは、一般的なプログラミング言語の OSS SDK を使用してビデオ情報を抽出する例を示しています。他のプログラミング言語を使用してビデオ情報を抽出するには、次のサンプルコードに基づいてパラメーターを変更できます。
Java
OSS SDK for Java 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.OSSObject;
import com.aliyun.oss.model.GetObjectRequest;
import com.aliyuncs.exceptions.ClientException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class Demo {
public static void main(String[] args) throws ClientException, ClientException {
// バケットが配置されているリージョンのエンドポイントを指定します。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケットが配置されているリージョンを指定します。例:cn-hangzhou。
String region = "cn-hangzhou";
// 環境変数からアクセス認証情報を取得します。
// サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットの名前を指定します。
String bucketName = "examplebucket";
// ビデオがバケットのルートディレクトリに保存されている場合は、ビデオ名のみを入力します。ビデオがバケットのルートディレクトリに保存されていない場合は、ビデオの完全なパスを指定します。例:exampledir/example.mp4。
String key = "example.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 {
// ビデオ情報の抽出を使用するための処理命令を作成します。
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
getObjectRequest.setProcess("video/info");
// getObject メソッドを使用します。
OSSObject ossObject = ossClient.getObject(getObjectRequest);
// ビデオ情報を読み取って表示します。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = ossObject.getObjectContent().read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
String videoInfo = baos.toString("UTF-8");
System.out.println("Video Info:");
System.out.println(videoInfo);
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
} finally {
// OSSClient インスタンスをシャットダウンします。
ossClient.shutdown();
}
}
}
PHP
OSS SDK for PHP V2.7.0 以降が必要です。
<?php
if (is_file(__DIR__ . '/../autoload.php')) {
require_once __DIR__ . '/../autoload.php';
}
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
try {
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = 'https://oss-cn-hangzhou.aliyuncs.com';
// バケットの名前を指定します。例:examplebucket。
$bucket = 'examplebucket';
// ビデオがバケットのルートディレクトリに保存されている場合は、ビデオ名のみを入力します。ビデオがバケットのルートディレクトリに保存されていない場合は、ビデオの完全なパスを指定します。例:exampledir/example.mp4。
$key = 'example.mp4';
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
// バケットが配置されているAlibaba Cloud リージョンの ID を指定します。
"region" => "cn-hangzhou"
);
$ossClient = new OssClient($config);
// ビデオ情報の抽出を使用するための処理命令を作成します。
$options[$ossClient::OSS_PROCESS] = "video/info";
$result = $ossClient->getObject($bucket,$key,$options);
var_dump($result);
} catch (OssException $e) {
printf($e->getMessage() . "\n");
return;
}Python
OSS SDK for Python V2.18.4 以降が必要です。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。
# サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# バケットが配置されているAlibaba Cloud リージョンの ID を指定します。
region = 'cn-hangzhou'
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)
# ビデオがバケットのルートディレクトリに保存されている場合は、ビデオ名を入力します。
# ビデオがバケットのルートディレクトリに保存されていない場合は、ビデオの完全なパスを指定します。例:exampledir/example.mp4。
key = 'example.mp4'
# ビデオ情報の抽出を使用するための処理命令を作成します。
process = 'video/info'
try:
# process パラメーターを使用して、処理命令を get_object メソッドに渡します。
result = bucket.get_object(key, process=process)
# ビデオ情報を読み取って表示します。
video_info = result.read().decode('utf-8')
print("Video Info:")
print(video_info)
except oss2.exceptions.OssError as e:
print("Error:", e)Go
OSS SDK for Go V3.0.2 以降が必要です。
package main
import (
"fmt"
"io"
"os"
"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 に設定します。
// バケットが配置されているAlibaba Cloud リージョンの ID を指定します。例:cn-hangzhou。
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)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// ビデオがバケットのルートディレクトリに保存されている場合は、ビデオ名のみを入力します。ビデオがバケットのルートディレクトリに保存されていない場合は、ビデオの完全なパスを指定します。例:exampledir/example.mp4。
// oss.Process メソッドを使用して処理命令を作成します。
body, err := bucket.GetObject("example.mp4", oss.Process("video/info"))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
defer body.Close()
data, err := io.ReadAll(body)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("data:", string(data))
}
パラメーター
操作:video/info
返される情報は JSON 形式です。詳細については、「DetectMediaMeta」をご参照ください。
OSS API の使用
リクエストの例
GET /example.mkv?x-oss-process=video/info HTTP/1.1 Host: video-demo.oss-cn-hangzhou.aliyuncs.com Date: Fri, 28 Oct 2022 06:40:10 GMT Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e成功レスポンスの例
HTTP/1.1 200 OK Server: AliyunOSS Date: Wed, 25 May 2022 12:43:57 GMT Content-Type: application/json;charset=utf-8 Content-Length: 161 Connection: keep-alive x-oss-request-id: 628E2481184E20F26C000009 x-oss-transfer-acc-type: acc-none x-oss-data-location: oss-cn-hangzhou-a ETag: "D0F162350DA037F4DC2A142B2E116BD0" Last-Modified: Wed, 25 May 2022 12:20:34 GMT x-oss-object-type: Normal x-oss-hash-crc64ecma: 2040549661341440100 x-oss-storage-class: Standard x-oss-server-time: 12437 { "RequestId":"E63E1EFB-6D65-59DE-A11D-B0B761FDB301", "Size":81714666, "VideoWidth":2160, "FormatLongName":"Matroska / WebM", "FormatName":"matroska,webm" "Duration":75.669, "Bitrate":8639169, "ProduceTime":"2022-01-27T06:08:11Z", "StreamCount":4, "VideoHeight":3840, "VideoStreams": [ { "CodecTag":"0x0000", "FrameRate":"50/1", "SampleAspectRatio":"1:1", "ColorSpace":"bt709", "StartTime":0.044, "ColorRange":"tv", "CodecName":"h264", "BitDepth":8, "Profile":"High", "DisplayAspectRatio":"9:16", "CodecTagString":"[0][0][0][0]", "HasBFrames":1, "AverageFrameRate":"50/1", "ColorPrimaries":"bt709", "CodecLongName":"H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10", "Height":3840, "PixelFormat":"yuv420p", "Level":51, "Width":2160, "TimeBase":"1/1000" } ], "AudioStreams": [ { "CodecTag":"0x0000", "CodecTagString":"[0][0][0][0]", "SampleRate":48000, "ChannelLayout":"stereo", "CodecLongName":"AAC (Advanced Audio Coding)", "Index":1, "CodecName":"aac", "TimeBase":"1/1000", "SampleFormat":"fltp", "Channels":2 }, { "CodecTag":"0x0000", "CodecTagString":"[0][0][0][0]", "SampleRate":48000, "ChannelLayout":"stereo", "CodecLongName":"AAC (Advanced Audio Coding)", "Index":2, "CodecName":"aac", "TimeBase":"1/1000", "SampleFormat":"fltp", "Channels":2 } ], "Subtitles": [ { "CodecTag":"0x0000", "CodecTagString":"[0][0][0][0]", "CodecLongName":"SubRip subtitle", "Index":3, "Duration":75.669, "CodecName":"subrip" } ], }
注意事項
ビデオ情報の抽出機能は、同期処理 (x-oss-process) のみサポートしています。
匿名アクセスはサポートされていません。
ビデオ情報の抽出には、IMM の DetectMediaMeta 操作の呼び出しが必要であり、関連費用が発生します。詳細については、「課金対象項目」をご参照ください。
FAQ
アップロード前に使用されたコーデックが原因で発生したビデオ再生の問題を解決するにはどうすればよいですか?
OSS のビデオトランスコード機能または IMM のライブトランスコード機能を使用して、ビデオをトランスコードできます。詳細については、「ビデオトランスコード」および「ライブトランスコード」をご参照ください。
OSS に保存されているビデオの幅と高さをクエリするにはどうすればよいですか?
IMM を使用して、OSS に保存されているビデオの幅と高さをクエリできます。ビデオの幅または高さが要件を満たしていない場合は、ビデオをトランスコードできます。詳細については、「ビデオトランスコード」をご参照ください。