Sprite Cascading Style Sheets (CSS) adalah kumpulan citra yang digabungkan ke dalam satu file citra tunggal. Sprite terutama digunakan untuk optimisasi performa situs web dan pengembangan antarmuka depan. Anda dapat menggunakan properti background-position CSS untuk mengurangi permintaan HTTP, meningkatkan kecepatan pemuatan halaman, dan memperbaiki pengalaman pengguna. Fitur pembuatan sprite memungkinkan Anda mengekstrak frame video dan menggabungkannya menjadi sebuah sprite. Topik ini menjelaskan parameter untuk pembuatan sprite dari tangkapan video serta memberikan contoh.
Catatan Penggunaan
Pembuatan sprite dari tangkapan video hanya mendukung pemrosesan asinkron (x-oss-async-process).
Proses pembuatan sprite dapat gagal atau menghasilkan jumlah gambar yang salah jika cap waktu video atau aliran rusak.
Sebelum menggunakan fitur ini, Anda harus menyambungkan Proyek IMM. Untuk informasi lebih lanjut tentang cara menyambungkan proyek di Konsol atau menggunakan API, lihat Memulai Cepat dan AttachOSSBucket - Menyambungkan Bucket OSS.
Akses anonim akan ditolak.
Anda harus memiliki izin yang diperlukan untuk menggunakan fitur ini. Untuk informasi lebih lanjut, lihat izin.
Parameter
Action: video/sprite
Tabel berikut menjelaskan parameter.
Parameter | Tipe | Diperlukan | Deskripsi |
ss | int | Tidak | Waktu mulai untuk menghasilkan sprite. Unit: milidetik. Nilai valid:
|
f | string | Ya | Format output sprite. Nilai valid:
Catatan Resolusi maksimum adalah 16384px × 16384px. |
m | string | Tidak | Mode penangkapan frame untuk sub-gambar sprite. Nilai default adalah inter. Nilai valid:
|
thr | int | Tidak | Ambang batas penangkapan frame untuk sub-gambar sprite dalam mode dhash. Ambang batas yang lebih besar menghasilkan lebih sedikit frame yang ditangkap. Nilai valid: [0, 100]. Nilai default: 0. Catatan Parameter ini hanya valid dalam mode dhash. Mode dhash sensitif terhadap ambang batas. Atur parameter ini ke nilai tidak lebih dari 25 dan sesuaikan sesuai kebutuhan. |
num | int | Tidak | Jumlah frame yang akan ditangkap untuk sub-gambar sprite. Nilai default: 0, yang menunjukkan tidak ada batasan pada jumlah frame yang ditangkap. Nilai default memiliki arti berbeda dalam mode penangkapan frame yang berbeda:
Penting Jumlah sebenarnya dari frame yang ditangkap mungkin lebih sedikit daripada nilai yang ditentukan karena panjang video dan parameter penangkapan frame. |
inter | int | Tidak | Interval untuk menangkap frame untuk sub-gambar sprite. Unit: milidetik. Nilai default: 0, yang menunjukkan bahwa semua frame video ditangkap. Catatan Jika nilai parameter ini lebih kecil dari interval frame (kebalikan dari laju frame) video sumber, frame ditangkap berdasarkan interval frame video sumber. |
sw | int | Tidak | Lebar sub-gambar sprite. Unit: px. Nilai valid: [32, 4096]. Secara default, lebar sub-gambar sama dengan lebar video sumber. |
sh | int | Tidak | Tinggi sub-gambar sprite. Unit: px. Nilai valid: [32, 4096]. Secara default, tinggi sub-gambar sama dengan tinggi video sumber. |
psw | int | Tidak | Persentase lebar sub-gambar sprite relatif terhadap lebar video sumber. Nilai valid: (0, 200]. Nilai default: 100. Catatan Jika Anda menyetel parameter sw dan psw, parameter psw tidak berlaku. |
psh | int | Tidak | Persentase tinggi sub-gambar sprite relatif terhadap tinggi video sumber. Nilai valid: (0, 200]. Nilai default: 100. Catatan Jika Anda menyetel parameter sh dan psh, parameter psh tidak berlaku. |
scaletype | string | Tidak | Mode penskalaan. Nilai valid:
|
tw | int | Tidak | Jumlah sub-gambar di setiap baris sprite. Nilai default: 6. Nilai valid: [1, 100]. |
th | int | Tidak | Jumlah sub-gambar di setiap kolom sprite. Nilai default: 6. Nilai valid: [1, 100]. |
pad | int | Tidak | Padding antara sub-gambar dalam sprite. Unit: px. Nilai default: 2. Nilai valid: [0, 100]. |
margin | int | Tidak | Margin di sekitar tepi sprite. Unit: px. Nilai default: 2. Nilai valid: [0, 100]. |
Parameter sys/saveas dan notify juga digunakan saat menghasilkan sprite dari tangkapan video. Untuk informasi lebih lanjut, lihat Simpan Sebagai dan Notifikasi.
Gunakan REST API
Jika Anda tidak menentukan ekstensi file, seperti .jpg, dalam jalur penyimpanan sprite keluaran, sistem secara otomatis menambahkan nomor ordinal ke nama file, misalnya _0_1.jpg. Jika Anda menentukan ekstensi file, hanya sprite terakhir yang disimpan. Oleh karena itu, kami sarankan Anda tidak menentukan ekstensi file. Untuk menyesuaikan nomor ordinal, gunakan variabel terkait Pemrosesan Media ApsaraVideo.
Hasilkan sprite untuk seluruh video dengan menangkap satu frame setiap 2 detik
Anda dapat menghasilkan sprite untuk seluruh video dengan menangkap satu frame setiap 2 detik. Setiap sprite berisi kisi 3 × 3 sub-gambar, dan setiap sub-gambar memiliki resolusi 200 × 150.
Informasi Sprite
File Sumber
Nama video: example.mkv
Notifikasi Pesan
Topik MNS untuk notifikasi: example-mns-topic
Konfigurasi Output
Informasi Penangkapan Frame
Format sprite: jpg
Interval penangkapan frame untuk sub-gambar: 2 s
Tata letak kisi sub-gambar: 3 × 3
Resolusi sub-gambar: 200 × 150
Mode penskalaan sub-gambar: crop
Padding antara sub-gambar: 0
Margin di sekitar sub-gambar: 0
Jalur Penyimpanan File
File JPG: oss://outbucket/outobjprefix-%d.jpg
Contoh
// Hasilkan sprite dari file video example.mkv.
POST /exmaple.mkv?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: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e
x-oss-async-process=video/sprite,f_jpg,sw_200,sh_150,inter_2000,tw_3,th_3,pad_0,margin_0|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LXtpbmRleH0ue2F1dG9leHR9Cg/notify,topic_ZXhhbXBsZS1tbnMtdG9waWMKHasilkan sprite dengan menangkap frame pada interval genap berdasarkan jumlah tertentu
Anda dapat menghasilkan sprite 10 × 10 di mana sub-gambar secara merata mencakup seluruh video. Ini menyederhanakan logika frontend.
Informasi Sprite
File Sumber
Nama video: example.mkv
Notifikasi Pesan
Topik MNS untuk notifikasi: example-mns-topic
Konfigurasi Output
Informasi Penangkapan Frame
Format sprite: jpg
Mode penangkapan frame untuk sub-gambar: avg
Tata letak kisi sub-gambar: 10 × 10
Resolusi sub-gambar: 1/10 dari video sumber
Mode penskalaan sub-gambar: fit
Padding antara sub-gambar: 4
Margin di sekitar sub-gambar: 5
Jalur Penyimpanan File
File JPG: oss://outbucket/outobjprefix-%d.jpg
Contoh
// Hasilkan sprite dari file video example.mkv.
POST /exmaple.mkv?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: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e
x-oss-async-process=video/sprite,f_jpg,m_avg,psw_10,psh_10,scaletype_fit,tw_10,th_10,pad_4,margin_5|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LXtpbmRleH0ue2F1dG9leHR9Cg/notify,topic_ZXhhbXBsZS1tbnMtdG9waWMKGunakan SDK
Pembuatan sprite asinkron dari tangkapan video didukung hanya oleh SDK untuk Java, Python, dan Go. Untuk informasi lebih lanjut, lihat Instal SDK.
Java
OSS SDK for Java versi 3.17.4 atau lebih baru diperlukan.
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 {
// Tentukan endpoint wilayah tempat bucket berada.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Tentukan ID wilayah yang sesuai dengan endpoint. Contoh: cn-hangzhou.
String region = "cn-hangzhou";
// Dapatkan kredensial akses dari variabel lingkungan. Sebelum menjalankan kode sampel ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Tentukan nama bucket.
String bucketName = "examplebucket";
// Tentukan nama file sprite.
String targetKey = "example.jpg";
// Tentukan nama file video sumber.
String sourceKey = "src.mp4";
// Buat instance OSSClient.
// Ketika instance OSSClient tidak lagi digunakan, panggil metode shutdown untuk melepaskan sumber dayanya.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Konfigurasikan parameter untuk menghasilkan sprite dari video.
String style = String.format("video/sprite,f_jpg,sw_100,sh_100,inter_10000,tw_10,th_10,pad_0,margin_0");
// Buat instruksi pemrosesan asinkron.
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/notify,topic_QXVkaW9Db252ZXJ0", style, bucketEncoded, targetEncoded);
// Buat objek AsyncProcessObjectRequest.
AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, sourceKey, process);
// Jalankan tugas pemrosesan asinkron.
AsyncProcessObjectResult response = ossClient.asyncProcessObject(request);
System.out.println("EventId: " + response.getEventId());
System.out.println("RequestId: " + response.getRequestId());
System.out.println("TaskId: " + response.getTaskId());
} finally {
// Matikan OSSClient.
ossClient.shutdown();
}
}
}Python
Python SDK versi 2.18.4 atau lebih baru diperlukan.
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Dapatkan kredensial akses sementara dari variabel lingkungan. Sebelum menjalankan kode sampel ini, pastikan variabel lingkungan OSS_ACCESS_KEY_ID dan OSS_ACCESS_KEY_SECRET telah dikonfigurasi.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Tentukan endpoint wilayah tempat bucket berada. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Tentukan ID wilayah yang sesuai dengan endpoint. Contoh: cn-hangzhou.
region = 'cn-hangzhou'
# Tentukan nama bucket.
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)
# Tentukan nama file video sumber.
source_key = 'src.mp4'
# Tentukan nama file sprite.
target_key = 'example.jpg'
# Konfigurasikan parameter untuk menghasilkan sprite dari video.
animation_style = 'video/sprite,f_jpg,sw_100,sh_100,inter_10000,tw_10,th_10,pad_0,margin_0'
# Buat instruksi pemrosesan yang mencakup jalur penyimpanan dan nama bucket serta nama objek yang dienkripsi Base64.
bucket_name_encoded = base64.urlsafe_b64encode('examplebucket'.encode()).decode().rstrip('=')
target_key_encoded = base64.urlsafe_b64encode(target_key.encode()).decode().rstrip('=')
process = f"{animation_style}|sys/saveas,b_{bucket_name_encoded},o_{target_key_encoded}/notify,topic_QXVkaW9Db252ZXJ0"
try:
# Jalankan tugas pemrosesan asinkron.
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 SDK versi 3.0.2 atau lebih baru diperlukan.
package main
import (
"encoding/base64"
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"log"
)
func main() {
// Dapatkan kredensial akses sementara dari variabel lingkungan. Sebelum menjalankan kode sampel ini, 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.
// Atur yourEndpoint ke endpoint bucket. Misalnya, jika bucket berada di wilayah China (Hangzhou), atur endpoint ke https://oss-cn-hangzhou.aliyuncs.com. Tentukan endpoint berdasarkan wilayah aktual Anda.
// Atur yourRegion ke ID wilayah Alibaba Cloud. Contoh: 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)
}
// Tentukan nama bucket. Contoh: examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Tentukan nama file video sumber.
sourceKey := "src.mp4"
// Tentukan nama file sprite keluaran.
targetKey := "example.jpg"
// Konfigurasikan parameter untuk menghasilkan sprite dari video.
animationStyle := "video/sprite,f_jpg,sw_100,sh_100,inter_10000,tw_10,th_10,pad_0,margin_0"
// Buat instruksi pemrosesan yang mencakup jalur penyimpanan dan nama bucket serta nama objek yang dienkripsi Base64.
bucketNameEncoded := base64.URLEncoding.EncodeToString([]byte(bucketName))
targetKeyEncoded := base64.URLEncoding.EncodeToString([]byte(targetKey))
process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify,topic_QXVkaW9Db252ZXJ0", animationStyle, bucketNameEncoded, targetKeyEncoded)
// Jalankan tugas pemrosesan asinkron.
result, err := bucket.AsyncProcessObject(sourceKey, process)
if err != nil {
log.Fatalf("Gagal memproses objek secara asinkron: %s", err)
}
fmt.Printf("EventId: %s\n", result.EventId)
fmt.Printf("RequestId: %s\n", result.RequestId)
fmt.Printf("TaskId: %s\n", result.TaskId)
}