ビデオのサムネイルを取得したり、ビデオ編集のためにキーフレームを抽出したり、ビデオモニタリングなどの特定のシナリオのためにフレームを抽出したりするには、ビデオを OSS バケットにアップロードし、ビデオスナップショット機能を使用してキーフレームイメージを抽出できます。
注意事項
H.264 または H.265 でエンコードされたビデオのスナップショットのみを撮ることができます。
デフォルトでは、OSS はビデオスナップショットからキャプチャされたイメージを保存しません。イメージを手動でダウンロードして、ローカルコンピューターに保存する必要があります。
ビデオスナップショット機能は、キャプチャされたイメージの数に基づいて課金されます。課金の詳細については、「データ処理料金」をご参照ください。
使用方法
前提条件
OSS でバケットを作成し、それにフレームキャプチャビデオをアップロードしている必要があります。
ビデオスナップショットを撮る
OSS では、リクエストに ?x-oss-process=video/snapshot,parame_value パラメーターを含めると、OSS はビデオをリアルタイムで処理し、結果を返します。video/snapshot はビデオスナップショット操作を指定します。parame はパラメーターを指定し、value はそのパラメーターの値を指定します。パラメーターの詳細については、このトピックの「パラメーター」をご参照ください。1 つのリクエストで複数のパラメーターを指定できます。
公開読み取りビデオの場合、ファイル URL に処理パラメーターを追加して、匿名ユーザーが処理済みファイルの URL に永続的にアクセスできるようにすることができます。ビデオが非公開の場合は、SDK を使用して操作を呼び出し、署名を含めてビデオを処理する必要があります。
公開読み取りファイル
公開読み取りファイルのスナップショットを撮るには、その URL に ?x-oss-process=video/snapshot,parame_value パラメーターを追加します。parame_value を必須パラメーターと値に置き換える必要があります。
元の URL | 処理パラメーター付きの URL |
https://oss-console-img-demo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/video.mp4 |
非公開ファイル
OSS SDK を使用して、処理パラメーターを含む署名付き URL を生成できます。これにより、URL を持つユーザーは処理されたビデオに一時的にアクセスできます。次のコードは、SDK を使用して非公開ビデオ用の ?x-oss-process=video/snapshot_value パラメーターを含む署名付き URL を生成する方法の例を示しています。
Java
package com.aliyun.oss.demo;
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-hangzhou.aliyuncs.com";
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケット名を指定します。例: examplebucket。
String bucketName = "examplebucket";
// ビデオファイルの完全なパスを指定します。ビデオファイルがバケットのルートディレクトリにない場合、パスにはビデオファイルが保存されているディレクトリを含める必要があります。例: examplefolder/videotest.mp4。
String objectName = "examplefolder/videotest.mp4";
// バケットが配置されているリージョンを指定します。この例では、中国 (杭州) リージョンが使用されます。リージョンを cn-hangzhou に設定します。
String region = "cn-hangzhou";
// 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 {
// 正確なスナップショットモードを使用して、ビデオの 17 秒時点でスナップショットをキャプチャします。スナップショットは JPG 形式で、幅と高さは 800 と 600 です。
String style = "video/snapshot,t_17000,f_jpg,w_800,h_600";
// 署名付き URL の有効期限を指定します。
Date expiration = new Date(new Date().getTime() + 3600 * 1000L );
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, objectName, HttpMethod.GET);
req.setExpiration(expiration);
req.setProcess(style);
URL signedUrl = ossClient.generatePresignedUrl(req);
System.out.println(signedUrl);
} catch (OSSException oe) {
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();
}
}
}
}Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケット名を指定します。
bucket = 'examplebucket'
# バケットが配置されているリージョンのエンドポイントを指定します。この例では、中国 (杭州) リージョンが使用されます。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Alibaba Cloud の汎用リージョン ID を指定します。
region = 'cn-hangzhou'
bucket = oss2.Bucket(auth, endpoint, bucket, region=region)
# ビデオファイルの完全なパスを指定します。ビデオファイルがバケットのルートディレクトリにない場合、パスにはビデオファイルが保存されているディレクトリを含める必要があります。例: examplefolder/videotest.mp4。
key = 'examplefolder/videotest.mp4'
# 有効期限を秒単位で指定します。
expire_time = 3600
# 正確なスナップショットモードを使用して、ビデオの 17 秒時点でスナップショットをキャプチャします。スナップショットは JPG 形式で、幅と高さは 800 と 600 です。
image_process = 'video/snapshot,t_17000,f_jpg,w_800,h_600'
# 処理パラメーターを含む署名付き URL を生成します。
url = bucket.sign_url('GET', key, expire_time, params={'x-oss-process': image_process}, slash_safe=True)
# 署名付き URL を出力します。
print(url)PHP
<?php
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
$provider = new EnvironmentVariableCredentialsProvider();
// yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
$endpoint = "yourEndpoint";
// バケット名を指定します。例: examplebucket。
$bucket= "examplebucket";
// ビデオファイルの完全なパスを指定します。ビデオファイルがバケットのルートディレクトリにない場合、パスにはビデオファイルが保存されているディレクトリを含める必要があります。例: examplefolder/videotest.mp4。
$object = "examplefolder/videotest.mp4";
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
"region"=> "cn-hangzhou"
);
$ossClient = new OssClient($config);
// 処理パラメーターを含む署名付き URL を生成します。URL は 3600 秒間有効です。ブラウザを使用して URL にアクセスできます。
$timeout = 3600;
$options = array(
// 正確なスナップショットモードを使用して、ビデオの 17 秒時点でスナップショットをキャプチャします。スナップショットは JPG 形式で、幅と高さは 800 と 600 です。
OssClient::OSS_PROCESS => "video/snapshot,t_17000,f_jpg,w_800,h_600");
$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
print("url: \n" . $signedUrl);Go
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func HandleError(err error) {
fmt.Println("Error:", err)
os.Exit(-1)
}
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 インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。この例では、中国 (杭州) リージョンのエンドポイントが使用されます。エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。実際のエンドポイントを指定してください。
// yourRegion をバケットが配置されているリージョンに設定します。この例では、中国 (杭州) リージョンが使用されます。リージョンを cn-hangzhou に設定します。実際のリージョンを指定してください。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
HandleError(err)
}
// イメージが保存されているバケットの名前を指定します。例: examplebucket。
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// ビデオファイルの完全なパスを指定します。ビデオファイルがバケットのルートディレクトリにない場合、パスにはビデオファイルが保存されているディレクトリを含める必要があります。例: examplefolder/videotest.mp4。
ossName := "examplefolder/videotest.mp4"
// 署名付き URL を生成し、有効期限を 3600 秒に設定します。
// 正確なスナップショットモードを使用して、ビデオの 17 秒時点でスナップショットをキャプチャします。スナップショットは JPG 形式で、幅と高さは 800 と 600 です。
signedURL, err := bucket.SignURL(ossName, oss.HTTPGet, 3600, oss.Process("video/snapshot,t_17000,f_jpg,w_800,h_600"))
if err != nil {
HandleError(err)
} else {
fmt.Println(signedURL)
}
}Node.js
const OSS = require("ali-oss");
const client = new OSS({
// yourregion をバケットが配置されているリージョンに設定します。この例では、中国 (杭州) リージョンが使用されます。リージョンを oss-cn-hangzhou に設定します。
region: "oss-cn-hangzhou",
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// yourbucketname をバケット名に設定します。
bucket: "examplebucket",
});
// 処理スタイル: "video/snapshot,t_17000,f_jpg,w_800,h_600"。
const signUrl = client.signatureUrl("examplefolder/videotest.mp4", {
expires: 3600,
process: "video/snapshot,t_17000,f_jpg,w_800,h_600",
});
console.log("signUrl=" + signUrl);.NET
using Aliyun.OSS;
using Aliyun.OSS.Common;
// yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var endpoint = "yourEndpoint";
// 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// ビデオが保存されているバケットの名前を指定します。例: examplebucket。
var bucketName = "examplebucket";
// 名前を指定します。ビデオがバケットのルートディレクトリにない場合は、ファイルの完全なパスを指定する必要があります。
var objectName = "examplefolder/videotest.mp4";
// バケットが配置されているリージョンを指定します。この例では、中国 (杭州) リージョンが使用されます。リージョンを cn-hangzhou に設定します。
const string region = "cn-hangzhou";
// ClientConfiguration インスタンスを作成し、必要に応じてデフォルトのパラメーターを変更します。
var conf = new ClientConfiguration();
// 署名を V4 に設定します。
conf.SignatureVersion = SignatureVersion.V4;
// OssClient インスタンスを作成します。
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// ビデオスナップショットを撮ります。
var process = "video/snapshot,t_17000,f_jpg,w_800,h_600";
var req = new GeneratePresignedUriRequest(bucketName, objectName, SignHttpMethod.Get)
{
Expiration = DateTime.Now.AddHours(1),
Process = process
};
// 署名付き URI を生成します。
var uri = client.GeneratePresignedUri(req);
Console.WriteLine("Generate Presigned Uri:{0} with process:{1} succeeded ", uri, process);
}
catch (OssException ex)
{
Console.WriteLine("Failed with error code: {0}; Error info: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}C
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
const char *endpoint = "yourEndpoint";
/* バケット名を指定します。例: examplebucket。 */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。 */
const char *object_name = "examplefolder/videotest.mp4";
/* yourRegion をバケットが配置されているリージョンに設定します。この例では、中国 (杭州) リージョンが使用されます。リージョンを cn-hangzhou に設定します。 */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* aos_string_t 型を char* 文字列で初期化します。 */
aos_str_set(&options->config->endpoint, endpoint);
/* 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
// 次の 2 つのパラメーターを設定する必要があります。
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* CNAME を使用するかどうかを指定します。0 は CNAME を使用しないことを示します。 */
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。 */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* プログラムエントリで aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。 */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリ管理用のメモリプール (pool) は apr_pool_t と同等です。実装コードは apr ライブラリにあります。 */
aos_pool_t *pool;
/* メモリプールを作成します。2 番目のパラメーターは NULL で、他のメモリプールを継承しないことを示します。 */
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。オプションには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル構成情報が含まれます。 */
oss_request_options_t *oss_client_options;
/* メモリプール内のオプションにメモリを割り当てます。 */
oss_client_options = oss_request_options_create(pool);
/* クライアントオプション oss_client_options を初期化します。 */
init_options(oss_client_options);
/* パラメーターを初期化します。 */
aos_string_t bucket;
aos_string_t object;
aos_table_t *params = NULL;
aos_http_request_t *req;
char *url_str;
apr_time_t now;
int64_t expire_time;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
params = aos_table_make(pool, 1);
apr_table_set(params, OSS_PROCESS, "video/snapshot,t_17000,f_jpg,w_800,h_600");
req = aos_http_request_create(pool);
req->method = HTTP_GET;
req->query_params = params;
/* 有効期限 (expire_time) を秒単位で指定します。 */
now = apr_time_now();
expire_time = now / 1000000 + 10 * 60;
/* 署名付き URL を生成します。 */
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
printf("url: %s\n", url_str);
/* メモリプールを解放します。これは、リクエスト中にリソースに割り当てられたメモリを解放することと同じです。 */
aos_pool_destroy(pool);
/* 以前に割り当てられたグローバルリソースを解放します。 */
aos_http_io_deinitialize();
return 0;
}C++
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* OSS アカウント情報を初期化します。 */
/* yourEndpoint をバケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 */
std::string Endpoint = "yourEndpoint";
/* yourRegion をバケットが配置されているリージョンに設定します。この例では、中国 (杭州) リージョンが使用されます。リージョンを cn-hangzhou に設定します。 */
std::string Region = "yourRegion";
/* ビデオが保存されているバケットの名前を指定します。例: examplebucket。 */
std::string BucketName = "examplebucket";
/* ビデオ名を指定します。イメージがバケットのルートディレクトリにない場合は、ファイルの完全なパスを指定する必要があります。 */
std::string ObjectName = "examplefolder/videotest.mp4";
/* ネットワークなどのリソースを初期化します。 */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 環境変数からアクセス資格情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。 */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 処理パラメーターを含むファイルの署名付き URL を生成します。 */
std::string Process = "video/snapshot,t_17000,f_jpg,w_800,h_600";
GeneratePresignedUrlRequest request(BucketName, ObjectName, Http::Get);
request.setProcess(Process);
auto outcome = client.GeneratePresignedUrl(request);
if (outcome.isSuccess()) {
std::cout << "Generated presigned URL: " << outcome.result() << std::endl;
} else {
std::cout << "Failed to generate presigned URL. Error code: " << outcome.error().Code()
<< ", Message: " << outcome.error().Message()
<< ", RequestId: " << outcome.error().RequestId() << std::endl;
}
/* ネットワークなどのリソースを解放します。 */
ShutdownSdk();
return 0;
}次のサンプルコードは、生成された署名付き URL の例を示しています。
https://examplebucket.oss-cn-hangzhou.aliyuncs.com/examplefolder/videotest.mp4?x-oss-process=video%2Fsnapshot%2Ct_17000%2Cf_jpg%2Cw_800%2Ch_600&x-oss-date=20250311T083843Z&x-oss-expires=3600&x-oss-signature-version=OSS4-HMAC-SHA256&x-oss-credential=LTAI********************%2F20241111%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-signature=6fd07a2ba50bf6891474dc56aed976b556b6fbcd901cfd01bcde5399bf4802cbパラメーター
操作: video/snapshot
パラメーター | 説明 | 有効な値 |
t | スナップショットがキャプチャされる時間。指定された時間がビデオのデュレーションを超えた場合、ビデオの最後のキーフレームが返されます。 説明 ビデオのサムネイルをキャプチャする場合は、t を 0 に設定します。 | [0, 動画時間] 単位: ms |
w | スナップショットの幅。このパラメーターを 0 に設定すると、幅はスナップショットの高さとソースビデオの高さの比率に基づいて計算されます。 | [0, ビデオ幅] 単位: ピクセル (px) |
h | スナップショットの高さ。このパラメーターを 0 に設定すると、高さはスナップショットの幅とソースビデオの幅の比率に基づいて計算されます。w と h の両方が 0 に設定されている場合、スナップショットはソースビデオと同じ幅と高さになります。 | [0, ビデオの高さ] 単位: ピクセル (px) |
m | スナップショットモード。このパラメーターを指定しない場合、デフォルトモードが使用され、指定された時点でスナップショットがキャプチャされます。このパラメーターを fast に設定すると、指定された時点の直前の最も近いキーフレームがキャプチャされます。 | 列挙値: fast |
f | 出力イメージのフォーマット。 | 列挙値: jpg および png |
ar | ビデオ情報に基づいてイメージを自動的に回転させるかどうかを指定します。 | 列挙値: auto、h、および w 次のリストは、列挙値について説明しています。
|