全部产品
Search
文档中心

Object Storage Service:Hasilkan Sprite dari Tangkapan Video

更新时间:Nov 09, 2025

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:

  • 0 (default): dari awal video.

  • Nilai lebih besar dari 0: dari milidetik yang ditentukan.

f

string

Ya

Format output sprite. Nilai valid:

  • jpg

  • png

Catatan

Resolusi maksimum adalah 16384px × 16384px.

m

string

Tidak

Mode penangkapan frame untuk sub-gambar sprite. Nilai default adalah inter. Nilai valid:

  • inter: mode interval tetap. Interval penangkapan frame ditentukan oleh parameter inter, dan jumlah frame yang ditangkap ditentukan oleh parameter num.

  • key: mode keyframe. Hanya frame IDR yang ditangkap dari video sumber. Jumlah frame yang ditangkap ditentukan oleh parameter num. Parameter inter tidak valid dalam mode ini.

  • avg: mode interval rata-rata. Frame ditangkap pada interval rata-rata berdasarkan parameter num. Parameter inter tidak valid dalam mode ini.

  • dhash: mode dhash. Frame ditangkap pada interval tetap. Frame paling signifikan yang kontennya berubah seiring waktu melebihi ambang batas dipilih. Interval penangkapan frame ditentukan oleh parameter inter, jumlah frame yang ditangkap ditentukan oleh parameter num, dan ambang batas ditentukan oleh parameter thr.

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:

  • Mode interval tetap: Frame ditangkap hingga akhir video.

  • Mode keyframe: Frame ditangkap hingga akhir video.

  • Mode interval rata-rata: Parameter ini tidak dapat disetel ke 0.

  • Mode dhash: Semua frame yang kontennya berubah melebihi nilai parameter thr ditangkap.

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:

  • crop: menskalakan dan memotong gambar.

  • stretch (default): meregangkan gambar untuk mengisi ruang.

  • fill: menskalakan gambar dan mempertahankan bilah hitam.

  • fit: secara proporsional menskalakan gambar tanpa bilah hitam.

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].

Catatan

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

Penting

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_ZXhhbXBsZS1tbnMtdG9waWMK

Hasilkan 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_ZXhhbXBsZS1tbnMtdG9waWMK

Gunakan 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)
}