Use o recurso de conversão de vídeo para imagem animada para transformar vídeos em imagens animadas nos formatos GIF e WebP.
Visão geral
A conversão de vídeo para imagem animada transforma um arquivo de vídeo em um formato de imagem animada, como GIF ou WebP, facilitando o compartilhamento e a incorporação em sites e redes sociais.

Cenários de uso
Compartilhamento em redes sociais: As imagens animadas permitem que os usuários compartilhem clipes de vídeo curtos em plataformas sociais para expressar emoções, momentos engraçados ou informações importantes.
Memes online: Converta vídeos em imagens animadas para criar memes divertidos ou engraçados que enriquecem as conversas online.
Tutoriais e demonstrações: Utilize imagens animadas em aulas ou demonstrações para mostrar operações de software ou instruções passo a passo, ajudando os espectadores a compreender rapidamente conceitos e procedimentos complexos.
Transmissões ao vivo e replays de eventos: Durante jogos, eventos ou transmissões ao vivo, use imagens animadas para recortar e compartilhar rapidamente momentos emocionantes com os espectadores, aumentando o engajamento.
Como usar
Pré-requisitos
Ative o service Intelligent Media Management (IMM).
Crie um bucket no OSS e envie os files to be processed para ele.
Crie um Projeto IMM e anexe-o. Anexe-o usando o OSS console ou chamando uma API. Defina a região do Projeto IMM para a mesma região do bucket.
Especifique as granted the required permissions para as operações e salve as alterações.
Converter um vídeo em uma imagem animada
Para converter um vídeo em uma imagem animada, use o processamento assíncrono com o OSS SDK para Java, Python ou Go.
Java
É necessário o OSS SDK para Java 3.17.4 ou posterior.
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 {
// The endpoint of the region in which the bucket is located.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// The region that corresponds to the endpoint, for example, cn-hangzhou.
String region = "cn-hangzhou";
// Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// The bucket name.
String bucketName = "examplebucket";
// The name of the destination animated GIF file.
String targetKey = "dest.gif";
// The name of the source video file.
String sourceKey = "src.mp4";
// Create an OSSClient instance.
// When the OSSClient instance is no longer needed, call the shutdown method to release its resources.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Build a style string that contains the parameters for video-to-animated-image conversion.
String style = String.format("video/animation,f_gif,w_100,h_100,inter_1000");
// Build the asynchronous processing instruction.
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);
// Create an AsyncProcessObjectRequest object.
AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, sourceKey, process);
// Execute the asynchronous processing task.
AsyncProcessObjectResult response = ossClient.asyncProcessObject(request);
System.out.println("EventId: " + response.getEventId());
System.out.println("RequestId: " + response.getRequestId());
System.out.println("TaskId: " + response.getTaskId());
} finally {
// Shut down the OSSClient instance.
ossClient.shutdown();
}
}
}
Python
É necessário o OSS SDK para Python 2.18.4 ou posterior.
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# The endpoint of the region in which the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# The region ID, for example, cn-hangzhou.
region = 'cn-hangzhou'
# The bucket name, for example, examplebucket.
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)
# The name of the source video file.
source_key = 'src.mp4'
# The name of the destination animated GIF file.
target_key = 'example.gif'
# Define the parameters for converting the video to an animated GIF, such as width, height, and frame interval.
animation_style = 'video/animation,f_gif,w_100,h_100,inter_1000'
# Build the processing instruction, including the save path and the Base64-encoded bucket name and target object name.
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:
# Execute the asynchronous processing task.
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
É necessário o OSS SDK para Go 3.0.2 ou posterior.
package main
import (
"encoding/base64"
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"log"
)
func main() {
// Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// Specify the endpoint of the bucket. For example, for a bucket in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, specify the actual endpoint.
// Specify the region ID, for example, 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)
}
// The bucket name, for example, examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// The name of the source video file.
sourceKey := "src.mp4"
// The name of the destination animated GIF file.
targetKey := "destexample.gif"
// Define the parameters for converting the video to an animated GIF, such as width, height, and frame interval.
animationStyle := "video/animation,f_gif,w_100,h_100,inter_1000"
// Build the processing instruction, including the save path and the Base64-encoded bucket name and target object name.
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)
// Execute the asynchronous processing task.
result, err := bucket.AsyncProcessObject(sourceKey, process)
if err != nil {
log.Fatalf("Failed to async process object: %s", err)
}
fmt.Printf("EventId: %s\n", result.EventId)
fmt.Printf("RequestId: %s\n", result.RequestId)
fmt.Printf("TaskId: %s\n", result.TaskId)
}
Parâmetros
Ação: video/animation
A tabela a seguir descreve os parâmetros.
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
ss |
int |
Não |
O horário de início da conversão de vídeo para imagem animada, em milissegundos. Valores válidos:
|
|
f |
string |
Sim |
O formato de saída da imagem animada. Valores válidos:
|
|
num |
int |
Não |
O número de quadros a serem extraídos para a imagem animada. Por padrão, os quadros são extraídos até o final do vídeo. Importante
Se o vídeo não for longo o suficiente para extrair o número especificado de quadros, o número real de quadros extraídos será menor que o valor especificado. |
|
inter |
int |
Não |
O intervalo de extração de quadros para a imagem animada, em milissegundos. Por padrão, todos os quadros do vídeo são extraídos. Nota
Se o valor deste parâmetro for menor que o intervalo de quadros do vídeo source (o inverso da taxa de quadros), os quadros serão extraídos no intervalo de quadros do vídeo source. |
|
fps |
float |
Não |
A taxa de quadros da imagem animada. O valor padrão é o inverso de inter. Valores válidos: [0, 240]. Nota
Este parâmetro controla a velocidade de reprodução da imagem animada. O valor padrão corresponde à velocidade do vídeo source. Um valor maior acelera a reprodução, enquanto um valor menor a desacelera. |
|
w |
int |
Não |
A largura da imagem animada de saída, em pixels. Valores válidos: [32, 4096]. Por padrão, a largura é igual à largura do vídeo source. |
|
h |
int |
Não |
A altura da imagem animada de saída, em pixels. Valores válidos: [32, 4096]. Por padrão, a altura é igual à altura do vídeo source. |
|
scaletype |
string |
Não |
O modo de redimensionamento. Valores válidos:
|
O processo de conversão de vídeo para imagem animada usa os parâmetros sys/saveas e notify. Para obter mais informações, consulte Salve como e Message notification.
Exemplos de requisição
Extrair um quadro por segundo
Arquivo de vídeo source: example.mkv
Parâmetros de processamento:
Formato de saída: gif (
f_gif)Resolução da imagem de saída: 100 px × 100 px (
w_100,h_100)Intervalo de extração de quadros: 1 segundo (
inter_1000)
Caminho de armazenamento: oss://outbucket/outobjprefix.{autoext}
Bucket: outbucket (codificado em Base64:
b_b3V0YnVja2V0)Objeto: outobjprefix.{autoext} (codificado em Base64:
o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ)
Parâmetros de notificação:
Método de notificação: Enviar uma mensagem MNS
Tópico de notificação: AudioConvert (codificado em Base64:
topic_QXVkaW9Db252ZXJ0)
Exemplo de requisição
// Convert the example.mkv file into an animated image.
POST /example.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/animation,f_gif,w_100,h_100,inter_1000|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ/notify,topic_QXVkaW9Db252ZXJ0
Extrair quadros a partir de um horário de início específico
Arquivo de vídeo source: example.mkv
Parâmetros de processamento:
Formato de saída: webp (
f_webp)Resolução da imagem de saída: 25% da largura e altura do vídeo source (
pw_25, ph_25)Intervalo de extração de quadros: 0,5 s (
inter_500)
Caminho de armazenamento: oss://outbucket/outobjprefix.{autoext}
Bucket: outbucket (codificado em Base64:
b_b3V0YnVja2V0)Objeto: outobjprefix.{autoext} (codificado em Base64:
o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ)
Parâmetros de notificação:
Método de notificação: Enviar uma mensagem MNS
Tópico de notificação: AudioConvert (codificado em Base64:
topic_QXVkaW9Db252ZXJ0)
Exemplo de requisição
// Convert the example.mkv file into an animated image.
POST /example.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/animation,ss_5000,f_webp,pw_25,ph_25,fps_25,inter_500|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ/notify,topic_QXVkaW9Db252ZXJ0
Faturamento
A conversão de vídeo para imagem animada gera cobranças tanto do OSS quanto do IMM. Os itens faturáveis incluem:
-
OSS: Para obter mais informações sobre preços, consulte Preços do OSS.
API
Item faturável
Descrição
GetObject
Requisições GET
As taxas de requisição são calculadas com base no número de requisições bem-sucedidas.
Tráfego de saída pela internet
Se você chamar a operação GetObject usando um endpoint público (por exemplo, oss-cn-hangzhou.aliyuncs.com) ou um endpoint de aceleração de transferência (por exemplo, oss-accelerate.aliyuncs.com), será cobrado pelo tráfego de saída pela internet com base no volume de dados.
Recuperação de dados do armazenamento de Acesso Infrequente (IA)
Se você recuperar objetos de Acesso Infrequente (IA), será cobrado pelas taxas de recuperação de dados com base na quantidade de dados recuperados.
Recuperação de dados para leitura direta de arquivo
Se você ler objetos Archive de um bucket com leitura direta de arquivo ativada, será cobrado pelas taxas de recuperação de dados com base na quantidade de dados recuperados.
Aceleração de transferência
Se você ativar a aceleração de transferência e usar um endpoint de aceleração de transferência para acessar seu bucket, será cobrado pelas taxas de aceleração de transferência com base no volume de dados.
PutObject
Requisições PUT
As taxas de requisição são calculadas com base no número de requisições bem-sucedidas.
Taxas de armazenamento
As taxas de armazenamento são cobradas com base na classe, no tamanho e na duração de armazenamento do objeto.
HeadObject
Requisições GET
As taxas de requisição são calculadas com base no número de requisições bem-sucedidas.
-
IMM: Para obter mais informações sobre preços, consulte IMM billing items.
ImportanteA partir das 11:00 (UTC+8) de 28 de julho de 2025, o recurso de conversão de vídeo para imagem animada do IMM será atualizado de um service gratuito para um service pago. O item faturável é MediaAnimation. Para obter mais informações, consulte o anúncio de ajuste de faturamento do IMM.
API
Item faturável
Descrição
CreateMediaConvertTask
MediaAnimation
As taxas de conversão de vídeo para imagem animada são calculadas com base no número de quadros na imagem animada de saída.
Observações de uso
A conversão de vídeo para imagem animada suporta apenas processamento assíncrono (usando o método x-oss-async-process).
O acesso anônimo será negado.