Use a transcodificação de vídeo para alterar codecs, reduzir resolução e taxa de bits, converter formatos de contêiner e ajustar parâmetros de vídeo conforme suas necessidades.
Descrição do recurso
A transcodificação de vídeo converte um fluxo de vídeo comprimido e codificado em outro fluxo. Esse processo altera parâmetros como formato de vídeo, formato de contêiner, resolução, taxa de quadros e taxa de bits para adaptar o vídeo à reprodução em diferentes dispositivos e plataformas. Além disso, reduz o tamanho do arquivo para otimizar a eficiência da transmissão.

Casos de uso
Compatibilidade com múltiplos dispositivos: Para garantir reprodução fluida em celulares, tablets, computadores e smart TVs, use a transcodificação de vídeo para converter vídeos em formatos específicos para cada dispositivo.
Reprodução de streaming: Serviços de streaming precisam transcodificar vídeos em vários formatos e taxas de bits. Isso permite ajustes dinâmicos com base nas condições de rede do usuário e melhora a experiência de visualização.
Compressão de vídeo: Transcodifique um vídeo para reduzir seu tamanho sem afetar significativamente a qualidade. Isso facilita o armazenamento e a transmissão eficientes, especialmente quando a largura de banda da rede é limitada.
Primeiros passos
Pré-requisitos
Você created a bucket e uploaded the files to process no bucket.
Crie e vincule um projeto IMM. Você pode bind the project in the OSS console ou by calling an API. O projeto IMM deve estar na mesma região do bucket.
-
Verifique se você possui the required permissions for the operations. Contas Alibaba Cloud têm todas as permissões por padrão. Usuários e funções RAM exigem autorização por meio de uma RAM policy ou bucket policy.
Permissions
Usar o SDK
A transcodificação de vídeo usa o recurso de processamento assíncrono dos SDKs do OSS para Java, Python e Go.
Java
É necessário o OSS SDK for 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 {
// Set the endpoint. For example, if your bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Specify the region ID, for example, cn-hangzhou.
String region = "cn-hangzhou";
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Specify the bucket name, for example, examplebucket.
String bucketName = "examplebucket";
// Specify the name of the output video file.
String targetKey = "dest.avi";
// Specify the name of the source video file.
String sourceKey = "src.mp4";
// Create an OSSClient instance.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Build the video processing style string that includes video transcoding parameters.
String style = String.format("video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1");
// 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", style, bucketEncoded, targetEncoded);
// Create an AsyncProcessObjectRequest object.
AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, sourceKey, process);
// Start 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 to release resources.
ossClient.shutdown();
}
}
}
Python
É necessário o OSS SDK for Python 2.18.4 ou posterior.
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Set the endpoint. For example, if your bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com.
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Specify the bucket name.
bucket_name = 'examplebucket'
# Specify the region ID, for example, cn-hangzhou.
region = 'cn-hangzhou'
# Create a Bucket object.
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# Specify the name of the source video file.
source_key = 'src.mp4'
# Specify the name of the output video file.
target_key = 'dest.avi'
# Build the video processing style string that includes video transcoding parameters.
style = 'video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1'
# Build the asynchronous processing instruction.
process = "{0}|sys/saveas,b_{1},o_{2}".format(style,
oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(bucket_name))).replace('=', ''),
oss2.compat.to_string(base64.urlsafe_b64encode(oss2.compat.to_bytes(target_key))).replace('=', ''))
# Call the asynchronous media processing API.
try:
# Start 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 for Go 3.0.2 ou posterior.
package main
import (
"encoding/base64"
"fmt"
"os"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain access credentials from environment variables. Before you run the sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// Set the endpoint. For example, if your bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, specify the actual endpoint.
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)
}
// Specify the bucket name, for example, examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
// Specify the name of the output video file.
targetObject := "dest.avi"
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Specify the name of the source video file.
sourceObject := "src.mp4"
// Build the video processing style string that includes video transcoding parameters.
style := "video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1"
// Build the asynchronous processing instruction.
process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v", style, strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(bucketName)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetObject)), "="))
fmt.Printf("%#v\n", process)
// Start the asynchronous processing task.
rs, err := bucket.AsyncProcessObject(sourceObject, process)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("EventId:%s\n", rs.EventId)
fmt.Printf("RequestId:%s\n", rs.RequestId)
fmt.Printf("TaskId:%s\n", rs.TaskId)
}
Parâmetros
Operação: video/convert
Esta tabela descreve os parâmetros desta operação.
Parameter | Type | Required | Description |
ss | int | No | Tempo inicial da transcodificação, em milissegundos. Valores válidos:
|
t | int | No | Duração da transcodificação, em milissegundos. Valores válidos:
|
f | string | Yes | Tipo de contêiner de mídia. Valores válidos:
|
vn | int | No | Define se o fluxo de vídeo deve ser desativado. Valores válidos:
|
vcodec | string | No | Codec de vídeo. Valores válidos:
|
fps | float | No | Taxa de quadros do vídeo. O valor deve estar entre 0 e 240. |
fpsopt | int | No | Define como aplicar a taxa de quadros do vídeo. Valores válidos:
|
pixfmt | string | No | Formato de pixel. O padrão é o formato de pixel do vídeo de origem. Valores válidos:
|
s | string | No | Resolução de destino.
|
sopt | int | No | Define como aplicar a resolução de destino. Valores válidos:
|
scaletype | string | No | Modo de redimensionamento. Valores válidos:
|
arotate | int | No | Ativa ou desativa a orientação adaptativa da resolução. Valores válidos:
|
g | int | No | Intervalo de quadros-chave. O valor deve estar entre 1 e 100.000. |
vb | int | No | Taxa de bits de vídeo de destino, em bits por segundo (bps). O valor deve estar entre 10.000 e 100.000.000. |
vbopt | int | No | Define como aplicar a taxa de bits de vídeo de destino. Valores válidos:
|
crf | float | No | Fator de taxa constante (CRF). O valor deve estar entre 0 e 51. |
maxrate | int | No | Taxa de bits máxima, em bits por segundo (bps). O valor deve estar entre 10.000 e 100.000.000. |
bufsize | int | No | Tamanho do buffer, em bits. O valor deve estar entre 10.000 e 200.000.000. |
an | int | No | Define se o fluxo de áudio deve ser desativado. Valores válidos:
|
acodec | string | No | Codec de áudio. Valores válidos:
|
ar | int | No | Taxa de amostragem de áudio. Valores válidos:
|
ac | int | No | Número de canais de áudio. O padrão é o número de canais do áudio de origem. O valor deve estar entre 1 e 8. |
aq | int | No | Qualidade de compressão de áudio. Mutuamente exclusivo com o parâmetro ab. Intervalo de valores: 0 a 100. |
ab | int | No | Taxa de bits de áudio. Mutuamente exclusivo com o parâmetro aq. Unidade: bits por segundo (bps). Intervalo de valores: 1000 a 10000000. |
abopt | int | No | Define como aplicar a taxa de bits de áudio de destino. Valores válidos:
|
sn | int | No | Define se as legendas devem ser desativadas. Valores válidos:
|
adepth | int | No | Profundidade de bits da amostragem de áudio. Valores válidos: Nota Este parâmetro é válido apenas quando |
segment | string | No | Configurações para segmentação de mídia. Por padrão, o vídeo não é segmentado. |
f | string | No | Formato de segmentação de mídia. Valores válidos:
Nó pai: |
t | int | No | Duração do segmento, em milissegundos. O valor deve estar entre 0 e 3.600.000. Nó pai: |
A transcodificação de vídeo também suporta os parâmetros sys/saveas (Save As) e notify (message notification).
Referência da API
Para personalização avançada, envie requisições REST API diretamente. Calcule uma assinatura para o cabeçalho Authorization. Signature V4 (Recommended).
Converter AVI para MP4
Configuração da tarefa
-
Objeto de origem
Formato de vídeo: AVI
Nome do vídeo: example.avi
Método de processamento: transcodificação de vídeo
-
Objeto de destino
-
Informações do vídeo
Formato de vídeo: MP4
Nome do vídeo: outobjprefix.mp4
Formato do fluxo de vídeo: H.265
Resolução do vídeo: 1920x1080
Taxa de quadros do vídeo: 30 fps
Taxa de bits do vídeo: 2 Mbps
-
Informações do áudio
Formato do fluxo de áudio: AAC
Taxa de bits do áudio: 100 Kbps
Fluxo de legendas: desativado
Caminho de saída: oss://outbucket/outobjprefix.mp4
-
Exemplo de requisição
POST /example.avi?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: SignatureValue
// Transcode the example.avi object. The output is an MP4 file with an H.265 video stream (1920x1080, 30 fps, 2 Mbps) and an AAC audio stream (100 Kbps). Subtitles are disabled. The output is saved to oss://outbucket/outobjprefix.mp4.
x-oss-async-process=video/convert,f_mp4,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ
Converter AVI para TS
Configuração da tarefa
-
Objeto de origem
Formato de vídeo: AVI
Nome do vídeo: example.avi
-
Método de processamento
Duração da transcodificação: Transcodifica um segmento de 60.000 milissegundos do arquivo de entrada, começando no milissegundo 10.000.
Método de segmentação: Cria segmentos HLS de 30 segundos.
Notificação de conclusão da transcodificação: Envia mensagens MNS.
-
Objeto de destino
-
Informações do vídeo
Formato de vídeo: TS
Formato do fluxo de vídeo: H.264
Taxa de bits do vídeo: 1 Mbps
-
Informações do áudio
Formato do fluxo de áudio: MP3
Taxa de bits do áudio: 100 Kbps
-
Caminho de saída
Objeto TS: oss://outbucket/outobjprefix-%d.ts
Objeto M3U8: oss://outbucket/outobjprefix.m3u8
-
Exemplo de requisição
POST /example.avi?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: SignatureValue
// Transcode the example.avi object.
x-oss-async-process=video/convert,ss_10000,t_60000,f_ts,vcodec_h264,vb_1000000,acodec_mp3,ab_100000/segment,f_hls,t_30000|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ/notify,topic_QXVkaW9Db252ZXJ0
Converter AVI para MP3
Configuração da tarefa
-
Objeto de origem
Nome do vídeo: example.avi
Formato de vídeo: AVI
Método de processamento: Extrair e transcodificar o fluxo de áudio.
-
Objeto de destino
Contêiner de áudio: MP3
Formato de codificação de áudio: MP3
Taxa de bits do áudio: 100 Kbps
Fluxo de vídeo: desativado
Fluxo de legendas: desativado
Caminho de saída: oss://outbucket/outobjprefix.mp3. Se um vídeo de origem tiver vários fluxos de áudio, apenas o primeiro será processado por padrão.
Exemplo de requisição
POST /example.avi?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: SignatureValue
// Extract and transcode the audio stream from the example.avi object.
x-oss-async-process=video/convert,f_mp3,acodec_mp3,ab_100000,vn_1,sn_1|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ
Faturamento
A transcodificação de vídeo gera itens faturáveis tanto para o OSS quanto para o IMM:
-
OSS: OSS Product Pricing.
API
Billable item
Description
GetObject
Requisição GET
As taxas de requisição são baseadas no número de requisições bem-sucedidas.
Tráfego de saída pela internet
Ao 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), há cobrança de tráfego de saída pela internet com base na quantidade de dados transferidos.
Recuperação de dados Infrequent Access
Se os dados recuperados estiverem na classe de armazenamento Infrequent Access, há cobrança de recuperação de dados Infrequent Access com base na quantidade de dados recuperados.
Recuperação de dados Archive-Direct Read
Se você ler um objeto Archive de um bucket com Archive-Direct Read ativado, há cobrança de recuperação de dados Archive-Direct Read com base na quantidade de dados recuperados.
Transfer Acceleration
Se o Transfer Acceleration estiver ativado e você acessar seu bucket usando um endpoint de aceleração de transferência, há cobrança de Transfer Acceleration com base na quantidade de dados transferidos.
PutObject
Requisição PUT
As taxas de requisição são baseadas no número de requisições bem-sucedidas.
Taxa de armazenamento
As taxas de armazenamento são baseadas na classe de armazenamento, tamanho e duração de armazenamento do objeto.
HeadObject
Requisição HEAD
As taxas de requisição são baseadas no número de requisições bem-sucedidas.
-
IMM: IMM billable items.
API
Billable item
Description
CreateMediaConvertTask
VideoCompress264LD
Taxas de transcodificação H.264-LD. Calculadas com base na duração do vídeo em segundos.
VideoCompress264SD
Taxas de transcodificação H.264-SD. Calculadas com base na duração do vídeo em segundos.
VideoCompress264HD
Taxas de transcodificação H.264-HD. Calculadas com base na duração do vídeo em segundos.
VideoCompress2642K
Taxas de transcodificação H.264-2K. Calculadas com base na duração do vídeo em segundos.
VideoCompress2644K
Taxas de transcodificação H.264-4K. Calculadas com base na duração do vídeo em segundos.
VideoCompress265LD
Taxas de transcodificação H.265-LD. Calculadas com base na duração do vídeo em segundos.
VideoCompress265SD
Taxas de transcodificação H.265-SD. Calculadas com base na duração do vídeo em segundos.
VideoCompress265HD
Taxas de transcodificação H.265-HD. Calculadas com base na duração do vídeo em segundos.
VideoCompress2652K
Taxas de transcodificação H.265-2K. Calculadas com base na duração do vídeo em segundos.
VideoCompress2654K
Taxas de transcodificação H.265-4K. Calculadas com base na duração do vídeo em segundos.
AudioCompress
Taxas de transcodificação de áudio.
Limites
A transcodificação de vídeo restringe-se ao processamento assíncrono (
x-oss-async-process).Não há suporte para acesso anônimo.
Formatos de vídeo suportados: MP4, MPEG-TS, MKV, MOV, AVI, FLV, M3U8, WebM, WMV, RM e VOB.
FAQ
Erro "ResourceNotFound" durante a transcodificação de vídeo
O erro ResourceNotFound, The specified resource Attachment is not found. indica que nenhum bucket está vinculado ao seu projeto IMM. Vincule um bucket ao projeto IMM para resolver o problema. OSS data processing usage guide.
Salvar a saída no caminho de origem
Não. O caminho de entrada não pode ser prefixo do caminho de saída. Isso evita comportamentos inesperados, como loops de gatilho ou sobrescrita do objeto de origem.
Definir a profundidade de bits do áudio
Sim. Use o parâmetro pixfmt em uma requisição x-oss-process do OSS.
Obter resultados da tarefa com um ID de tarefa
Use a operação GetTask no IMM para recuperar os resultados da tarefa.
Pesquisar e excluir objetos por sufixo
Não. O OSS não suporta pesquisa de objetos por sufixo porque utiliza armazenamento não ordenado.
Backend não recebendo mensagens
Verifique se o tópico e a assinatura existem. Caso não existam ou tenham sido excluídos, reconfigure a assinatura e reinicie a transcodificação.
Usar um modelo para transcodificação automática
Sim. Configure gatilhos para processar automaticamente vídeos novos e existentes em um bucket. Tarefas, processamento em lote e gatilhos aceitam modelos definidos pelo sistema e personalizados. Batch processing. Triggers.
Cobranças por vídeos transcodificados
Sim. Vídeos transcodificados ocupam espaço de armazenamento, o que gera cobranças.
Salvar a saída no caminho de origem
Não defina o caminho de saída igual ao caminho de origem, pois isso sobrescreverá o objeto de origem.