Untuk mendapatkan gambar mini video, mengekstrak keyframe untuk pengeditan video, atau mengekstrak frame untuk skenario tertentu seperti pemantauan video, Anda dapat mengunggah video ke bucket OSS dan menggunakan fitur tangkapan video untuk mengekstrak citra keyframe.
Langkah-langkah Pencegahan
Anda hanya dapat mengambil snapshot dari video yang di-encode dalam format H.264 atau H.265.
Secara default, OSS tidak menyimpan gambar yang diambil dari snapshot video. Anda harus mengunduh gambar secara manual dan menyimpannya ke komputer lokal Anda.
Anda akan dikenakan biaya untuk fitur snapshot video berdasarkan jumlah gambar yang diambil. Untuk informasi lebih lanjut tentang penagihan, lihat Biaya Pemrosesan Data.
Cara Menggunakan
Persyaratan Awal
Anda telah membuat bucket di OSS dan mengunggah video frame-capture ke dalamnya.
Ambil Snapshot Video
Di OSS, ketika Anda memasukkan parameter ?x-oss-process=video/snapshot,parame_value dalam permintaan, OSS memproses video secara real-time dan mengembalikan hasilnya. video/snapshot menentukan aksi snapshot video. parame menentukan parameter, dan value menentukan nilai untuk parameter tersebut. Untuk informasi lebih lanjut tentang parameter, lihat Parameter dalam topik ini. Anda dapat menentukan beberapa parameter dalam satu permintaan.
Untuk video baca-publik, Anda dapat menambahkan parameter pemrosesan ke URL file untuk mengizinkan pengguna anonim mengakses URL file yang diproses secara permanen. Jika video Anda bersifat pribadi, Anda harus menggunakan SDK untuk memanggil operasi dan menyertakan tanda tangan untuk memproses video.
File Baca-Publik
Untuk mengambil snapshot dari file baca-publik, tambahkan parameter ?x-oss-process=video/snapshot,parame_value ke URL-nya. Anda harus mengganti parame_value dengan parameter dan nilai yang diperlukan.
URL Asli | URL dengan Parameter Pemrosesan |
https://oss-console-img-demo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/video.mp4 |
File Pribadi
Anda dapat menggunakan SDK OSS untuk menghasilkan URL yang ditandatangani yang berisi parameter pemrosesan. Ini memungkinkan pengguna yang memiliki URL untuk sementara mengakses video yang telah diproses. Kode berikut memberikan contoh cara menggunakan SDK untuk menghasilkan URL yang ditandatangani yang berisi parameter ?x-oss-process=video/snapshot_value untuk video pribadi:
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 {
// Setel endpoint. Dalam contoh ini, endpoint wilayah China (Hangzhou) digunakan. Tentukan endpoint sebenarnya.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket. Contoh: examplebucket.
String bucketName = "examplebucket";
// Tentukan jalur lengkap file video. Jika file video tidak berada di direktori root bucket, jalur harus mencakup direktori tempat file video disimpan. Contoh: examplefolder/videotest.mp4.
String objectName = "examplefolder/videotest.mp4";
// Tentukan wilayah tempat bucket berada. Dalam contoh ini, wilayah China (Hangzhou) digunakan. Atur wilayah menjadi cn-hangzhou.
String region = "cn-hangzhou";
// Buat instance OSSClient.
// Ketika instance OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber daya.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Gunakan mode snapshot akurat untuk mengambil snapshot pada detik ke-17 video. Snapshot dalam format JPG, dan lebar serta tinggi adalah 800 dan 600.
String style = "video/snapshot,t_17000,f_jpg,w_800,h_600";
// Tentukan waktu kedaluwarsa URL yang ditandatangani.
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("Tangkap OSSException, yang berarti permintaan Anda berhasil sampai ke OSS, "
+ "tetapi ditolak dengan respons kesalahan karena alasan tertentu.");
System.out.println("Pesan Kesalahan:" + oe.getErrorMessage());
System.out.println("Kode Kesalahan:" + oe.getErrorCode());
System.out.println("ID Permintaan:" + oe.getRequestId());
System.out.println("ID Host:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Tangkap ClientException, yang berarti klien mengalami "
+ "masalah internal serius saat mencoba berkomunikasi dengan OSS, "
+ "seperti tidak dapat mengakses jaringan.");
System.out.println("Pesan Kesalahan:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Tentukan nama bucket.
bucket = 'examplebucket'
# Tentukan endpoint wilayah tempat bucket berada. Dalam contoh ini, wilayah China (Hangzhou) digunakan.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Tentukan ID wilayah umum Alibaba Cloud.
region = 'cn-hangzhou'
bucket = oss2.Bucket(auth, endpoint, bucket, region=region)
# Tentukan jalur lengkap file video. Jika file video tidak berada di direktori root bucket, jalur harus mencakup direktori tempat file video disimpan. Contoh: examplefolder/videotest.mp4.
key = 'examplefolder/videotest.mp4'
# Tentukan waktu kedaluwarsa dalam detik.
expire_time = 3600
# Gunakan mode snapshot akurat untuk mengambil snapshot pada detik ke-17 video. Snapshot dalam format JPG, dan lebar serta tinggi adalah 800 dan 600.
image_process = 'video/snapshot,t_17000,f_jpg,w_800,h_600'
# Hasilkan URL yang ditandatangani yang berisi parameter pemrosesan.
url = bucket.sign_url('GET', key, expire_time, params={'x-oss-process': image_process}, slash_safe=True)
# Cetak URL yang ditandatangani.
print(url)PHP
<?php
if (is_file(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
}
use OSS\Credentials\EnvironmentVariableCredentialsProvider;
use OSS\OssClient;
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
$provider = new EnvironmentVariableCredentialsProvider();
// Setel yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
$endpoint = "yourEndpoint";
// Tentukan nama bucket. Contoh: examplebucket.
$bucket= "examplebucket";
// Tentukan jalur lengkap file video. Jika file video tidak berada di direktori root bucket, jalur harus mencakup direktori tempat file video disimpan. Contoh: 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);
// Hasilkan URL yang ditandatangani yang berisi parameter pemrosesan. URL valid selama 3600 detik. Anda dapat menggunakan browser untuk mengakses URL.
$timeout = 3600;
$options = array(
// Gunakan mode snapshot akurat untuk mengambil snapshot pada detik ke-17 video. Snapshot dalam format JPG, dan lebar serta tinggi adalah 800 dan 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() {
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Buat instance OSSClient.
// Setel yourEndpoint ke endpoint bucket. Dalam contoh ini, endpoint wilayah China (Hangzhou) digunakan. Setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Tentukan endpoint sebenarnya.
// Setel yourRegion ke wilayah tempat bucket berada. Dalam contoh ini, wilayah China (Hangzhou) digunakan. Setel wilayah ke cn-hangzhou. Tentukan wilayah sebenarnya.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Setel versi tanda tangan.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
HandleError(err)
}
// Tentukan nama bucket tempat gambar disimpan. Contoh: examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
HandleError(err)
}
// Tentukan jalur lengkap file video. Jika file video tidak berada di direktori root bucket, jalur harus mencakup direktori tempat file video disimpan. Contoh: examplefolder/videotest.mp4.
ossName := "examplefolder/videotest.mp4"
// Hasilkan URL yang ditandatangani dan atur waktu kedaluwarsa menjadi 3600 detik.
// Gunakan mode snapshot akurat untuk mengambil snapshot pada detik ke-17 video. Snapshot dalam format JPG, dan lebar serta tinggi adalah 800 dan 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({
// Setel yourregion ke wilayah tempat bucket berada. Dalam contoh ini, wilayah China (Hangzhou) digunakan. Setel wilayah ke oss-cn-hangzhou.
region: "oss-cn-hangzhou",
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
accessKeyId: process.env.OSS_ACCESS_KEY_ID,
accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
authorizationV4: true,
// Setel yourbucketname ke nama bucket.
bucket: "examplebucket",
});
// Gaya pemrosesan: "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;
// Setel yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
var endpoint = "yourEndpoint";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// Tentukan nama bucket tempat video disimpan. Contoh: examplebucket.
var bucketName = "examplebucket";
// Tentukan nama. Jika video tidak berada di direktori root bucket, Anda harus menentukan jalur lengkap file.
var objectName = "examplefolder/videotest.mp4";
// Tentukan wilayah tempat bucket berada. Dalam contoh ini, wilayah China (Hangzhou) digunakan. Setel wilayah ke cn-hangzhou.
const string region = "cn-hangzhou";
// Buat instance ClientConfiguration dan modifikasi parameter default berdasarkan kebutuhan Anda.
var conf = new ClientConfiguration();
// Setel tanda tangan ke V4.
conf.SignatureVersion = SignatureVersion.V4;
// Buat instance OssClient.
var client = new OssClient(endpoint, accessKeyId, accessKeySecret, conf);
client.SetRegion(region);
try
{
// Ambil snapshot video.
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
};
// Hasilkan URI yang ditandatangani.
var uri = client.GeneratePresignedUri(req);
Console.WriteLine("Generate Presigned Uri:{0} with process:{1} succeeded ", uri, process);
}
catch (OssException ex)
{
Console.WriteLine("Gagal dengan kode kesalahan: {0}; Informasi kesalahan: {1}. \nRequestID:{2}\tHostID:{3}",
ex.ErrorCode, ex.Message, ex.RequestId, ex.HostId);
}
catch (Exception ex)
{
Console.WriteLine("Gagal dengan informasi kesalahan: {0}", ex.Message);
}C
#include "oss_api.h"
#include "aos_http_io.h"
/* Setel yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
const char *endpoint = "yourEndpoint";
/* Tentukan nama bucket. Contoh: examplebucket. */
const char *bucket_name = "examplebucket";
/* Tentukan jalur lengkap objek. Jalur lengkap tidak boleh berisi nama bucket. */
const char *object_name = "examplefolder/videotest.mp4";
/* Setel yourRegion ke wilayah tempat bucket berada. Dalam contoh ini, wilayah China (Hangzhou) digunakan. Setel wilayah ke cn-hangzhou. */
const char *region = "yourRegion";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* Inisialisasi tipe aos_string_t dengan string char*. */
aos_str_set(&options->config->endpoint, endpoint);
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
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"));
// Anda harus mengonfigurasi dua parameter berikut.
aos_str_set(&options->config->region, region);
options->config->signature_version = 4;
/* Menentukan apakah CNAME digunakan. 0 menunjukkan bahwa tidak ada CNAME yang digunakan. */
options->config->is_cname = 0;
/* Setel parameter jaringan, seperti periode timeout. */
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* Panggil metode aos_http_io_initialize di titik masuk program untuk menginisialisasi sumber daya global seperti jaringan dan memori. */
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* Pool memori (pool) untuk manajemen memori setara dengan apr_pool_t. Kode implementasi ada di perpustakaan apr. */
aos_pool_t *pool;
/* Buat pool memori. Parameter kedua adalah NULL, yang menunjukkan bahwa tidak ada pool memori lain yang diwarisi. */
aos_pool_create(&pool, NULL);
/* Buat dan inisialisasi opsi. Opsi mencakup informasi konfigurasi global seperti endpoint, access_key_id, access_key_secret, is_cname, dan curl. */
oss_request_options_t *oss_client_options;
/* Alokasikan memori untuk opsi di pool memori. */
oss_client_options = oss_request_options_create(pool);
/* Inisialisasi opsi klien oss_client_options. */
init_options(oss_client_options);
/* Inisialisasi parameter. */
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;
/* Tentukan waktu kedaluwarsa (expire_time) dalam detik. */
now = apr_time_now();
expire_time = now / 1000000 + 10 * 60;
/* Hasilkan URL yang ditandatangani. */
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
printf("url: %s\n", url_str);
/* Lepaskan pool memori. Ini setara dengan melepaskan memori yang dialokasikan untuk sumber daya selama permintaan. */
aos_pool_destroy(pool);
/* Lepaskan sumber daya global yang dialokasikan sebelumnya. */
aos_http_io_deinitialize();
return 0;
}C++
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* Inisialisasi informasi akun OSS. */
/* Setel yourEndpoint ke endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), setel endpoint ke https://oss-cn-hangzhou.aliyuncs.com. */
std::string Endpoint = "yourEndpoint";
/* Setel yourRegion ke wilayah tempat bucket berada. Dalam contoh ini, wilayah China (Hangzhou) digunakan. Setel wilayah ke cn-hangzhou. */
std::string Region = "yourRegion";
/* Tentukan nama bucket tempat video disimpan. Contoh: examplebucket. */
std::string BucketName = "examplebucket";
/* Tentukan nama video. Jika gambar tidak berada di direktori root bucket, Anda harus menentukan jalur lengkap file. */
std::string ObjectName = "examplefolder/videotest.mp4";
/* Inisialisasi sumber daya seperti jaringan. */
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi. */
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* Hasilkan URL yang ditandatangani untuk file yang berisi parameter pemrosesan. */
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;
}
/* Lepaskan sumber daya seperti jaringan. */
ShutdownSdk();
return 0;
}Kode sampel berikut menunjukkan contoh URL yang ditandatangani yang dihasilkan:
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=6fd07a2ba50bf6891474dc56aed976b556b6fbcd901cfd01bcde5399bf4802cbParameter
Aksi: video/snapshot
Parameter | Deskripsi | Nilai valid |
t | Waktu saat snapshot diambil. Jika waktu yang ditentukan melebihi durasi video, keyframe terakhir video dikembalikan. Catatan Jika Anda ingin mengambil thumbnail video, atur t ke 0. | [0, Durasi video] Satuan: ms |
w | Lebar snapshot. Jika Anda mengatur parameter ini ke 0, lebar dihitung berdasarkan rasio tinggi snapshot terhadap tinggi video sumber. | [0, Lebar video] Satuan: piksel (px) |
h | Tinggi snapshot. Jika Anda mengatur parameter ini ke 0, tinggi dihitung berdasarkan rasio lebar snapshot terhadap lebar video sumber. Jika w dan h keduanya diatur ke 0, snapshot memiliki lebar dan tinggi yang sama dengan video sumber. | [0, Tinggi video] Satuan: piksel (px) |
m | Mode snapshot. Jika Anda tidak menentukan parameter ini, mode default digunakan untuk mengambil snapshot pada titik waktu tertentu. Jika Anda mengatur parameter ini ke fast, keyframe terdekat sebelum titik waktu tertentu diambil. | Nilai enumerasi: fast |
f | Format gambar keluaran. | Nilai enumerasi: jpg dan png |
ar | Menentukan apakah akan memutar otomatis gambar berdasarkan informasi video. | Nilai enumerasi: auto, h, dan w Daftar berikut menjelaskan nilai-nilai enumerasi:
|