A transcodificação de vídeo permite alterar formatos de codificação, reduzir resolução e taxa de bits, converter formatos de contêiner e modificar parâmetros de vídeo para atender a diferentes requisitos de negócios. Este tópico descreve como configurar os parâmetros de transcodificação de vídeo e fornece exemplos práticos.
Cenários
Adaptação a diferentes dispositivos terminais e ambientes de rede
Altere a resolução e a taxa de bits de um arquivo de mídia para garantir compatibilidade com diversos dispositivos terminais e condições de rede.
Codificação eficiente para redução de custos
Utilize algoritmos de codificação eficientes no processamento de mídia para reduzir a taxa de bits e evitar travamentos durante a reprodução, sem comprometer a qualidade do vídeo. Essa abordagem economiza custos de armazenamento e tráfego.
Tecnologias de produção inteligente para aprimoramento e reprodução de vídeo
Aproveite as tecnologias de processamento de mídia e os recursos avançados de produção, como IA de vídeo e super-resolução, para transcodificar vídeos de baixa qualidade em versões de alta definição. Além disso, crie novos arquivos de mídia adicionando marcas d'água, capturando quadros de vídeo ou editando o conteúdo.
Pré-requisitos
O Intelligent Media Management (IMM) está ativado. Para mais informações, consulte Ativar o IMM.
O bucket correspondente do Object Storage Service (OSS) está vinculado a um projeto do IMM. Para saber como vincular um bucket do OSS a um projeto do IMM no console do OSS, consulte Introdução. Para obter detalhes sobre como vincular um bucket a um projeto do IMM usando a API do IMM, consulte AttachOSSBucket.
As permissões necessárias foram concedidas ao usuário do Resource Access Management (RAM) utilizado para acessar os recursos do IMM. Para mais informações, consulte Permissões.
Observações de uso
A transcodificação de vídeo suporta apenas processamento assíncrono (x-oss-async-process).
A transcodificação de vídeo não suporta acesso anônimo.
Formatos de vídeo suportados: MP4, MPEG-TS, MKV, MOV, AVI, FLV, M3U8, WebM, WMV, RM e VOB.
O uso da transcodificação de vídeo gera cobranças. As taxas de processamento de mídia constam nas faturas do IMM. Para mais detalhes, consulte Itens faturáveis.
Processo
A figura a seguir ilustra o processo de transcodificação de vídeo.
Faça upload de um arquivo de vídeo para um bucket.
Crie uma tarefa de transcodificação de mídia.
Após a execução da tarefa de transcodificação de mídia, salve o arquivo de vídeo transcodificado no OSS.
Parâmetros
Ação: video/convert
A tabela a seguir descreve os parâmetros para transcodificação de vídeo.
Parâmetro | Tipo | Obrigatório | Descrição |
ss | int | Não | Momento inicial do vídeo a partir do qual a transcodificação começa. Unidade: milissegundos. Valores válidos:
|
t | int | Não | Duração do conteúdo de vídeo a ser transcodificado após o tempo inicial especificado. Unidade: milissegundos. Valores válidos:
|
f | string | Sim | Tipo de contêiner de mídia. Valores válidos:
|
vn | int | Não | Define se a geração de fluxo de vídeo deve ser desativada. Valores válidos:
|
vcodec | string | Não | Formato de codificação do vídeo de saída. Valores válidos:
|
fps | float | Não | Taxa de quadros desejada. Valores válidos: 0 a 240. |
fpsopt | int | Não | Opção de taxa de quadros. Valores válidos:
|
pixfmt | string | Não | Formato de pixel desejado. Por padrão, corresponde ao formato de pixel da source. Valores válidos:
|
s | string | Não | Resolução desejada.
|
sopt | int | Não | Opção de resolução. Valores válidos:
|
scaletype | string | Não | Modo de redimensionamento. Valores válidos:
|
arotate | int | Não | Define se a orientação adaptativa da resolução deve ser ativada. Valores válidos:
|
g | int | Não | Intervalo de quadros-chave. Valores válidos: 1 a 100000. |
vb | int | Não | Taxa de bits de vídeo desejada. Unidade: bit/s. Valores válidos: 10000 a 100000000. |
vbopt | int | Não | Opção de taxa de bits de vídeo. Valores válidos:
|
crf | float | Não | Fator de taxa constante (CRF). Valores válidos: 0 a 51. |
maxrate | int | Não | Taxa de bits máxima. Unidade: bit/s. Valores válidos: 10000 a 100000000. |
bufsize | int | Não | Tamanho do buffer. Unidade: bit. Valores válidos: 10000 a 200000000. |
an | int | Não | Define se a geração de fluxo de áudio deve ser desativada. Valores válidos:
|
acodec | string | Não | Formato de codificação do áudio. Valores válidos:
|
ar | int | Não | Taxa de amostragem do áudio de saída. Valores válidos:
|
ac | int | Não | Número de canais de som no áudio de saída. Por padrão, mantém a mesma quantidade de canais do áudio original. Valores válidos: 1 a 8. |
aq | int | Não | Qualidade de compressão de áudio. Este parâmetro e o parâmetro ab são mutuamente exclusivos. Valores válidos: 0 a 100. |
ab | int | Não | Taxa de bits de áudio desejada. Este parâmetro e o parâmetro aq são mutuamente exclusivos. Valores válidos: 1000 a 10000000. |
abopt | int | Não | Opção de taxa de bits de áudio. Valores válidos:
|
sn | int | Não | Define se a geração de legendas deve ser desativada. Valores válidos:
|
adepth | int | Não | Profundidade de bits de amostragem do áudio de saída. Valores válidos: 16 e 24. Nota Este parâmetro só tem efeito se você definir o parâmetro acodec como flac. |
segment | string | Não | Configurações de segmentação de mídia. Por padrão, a segmentação não é aplicada. |
f | string | Não | Modo de segmentação de mídia. Valores válidos:
Nó pai: segment |
t | int | Não | Duração do segmento. Unidade: milissegundos. Valores válidos: 0 a 3600000. Nó pai: segment |
Talvez seja necessário usar também os parâmetros sys/saveas e notify em uma tarefa de transcodificação de vídeo. Para mais informações, consulte sys/saveas e Notificação de mensagens.
Usar a API do OSS
Converter de AVI para MP4
Informações da tarefa de transcodificação
-
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: 1920 × 1080
Taxa de quadros do vídeo: 30 fps
Taxa de bits do vídeo: 2 Mbit/s
-
Informações do áudio
Formato do fluxo de áudio: AAC
Taxa de bits do áudio: 100 Kbit/s
Fluxo de legendas: desativado
Caminho de saída: oss://outbucket/outobjprefix.mp4
-
Exemplo
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 to the MP4 container format and specify H.265 as the video stream format. Set the resolution to 1920 x 1080, frame rate to 30 fps, and video bitrate to 2 Mbit/s. Specify AAC as the audio stream format and set the audio bitrate to 100 Kbit/s. Disable subtitle stream generation. Save the output object as 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 de AVI para TS
Informações da tarefa de transcodificação
-
Objeto de origem
Formato de vídeo: AVI
Nome do vídeo: example.avi
-
Método de processamento
Trecho a transcodificar: Transcodifique 60.000 milissegundos do vídeo, começando a partir do milissegundo 1.000.
Segmentação: Crie segmentos de HTTP Live Streaming (HLS) em intervalos de 30 segundos.
Notificação de conclusão da transcodificação: Envie mensagens do Simple Message Queue (SMQ, anteriormente 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 Mbit/s
-
Informações do áudio
Formato de áudio: AAC
Taxa de bits do áudio: 100 Kbit/s
-
Caminhos de saída:
Objetos TS: oss://outbucket/outobjprefix-%d.ts
Objeto M3U8: oss://outbucket/outobjprefix.m3u8
-
Exemplo
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 video.
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 de AVI para MP3
Informações da tarefa de transcodificação
-
Objeto de origem
Nome do vídeo: example.avi
Formato de vídeo: AVI
Método de processamento: Extrair e converter áudio.
-
Objeto de destino
Formato de contêiner de áudio: MP3
Formato de codificação de áudio: MP3
Taxa de bits do áudio: 100 Kbit/s
Fluxo de vídeo: desativado
Fluxo de legendas: desativado
Caminho de saída: oss://outbucket/outobjprefix.mp3 (Se o vídeo contiver vários canais de áudio, apenas o primeiro canal será processado por padrão.)
Exemplo
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 audio from the example.avi object and transcode the extracted audio.
x-oss-async-process=video/convert,f_mp3,acodec_mp3,ab_100000,vn_1,sn_1|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqcHJlZml4LnthdXRvZXh0fQ
Usar SDKs do OSS
Use o SDK do OSS para Java, Python ou Go para transcodificar vídeos de forma assíncrona.
Java
Para usar o SDK do OSS para Java, certifique-se de que a versão do SDK seja V3.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 {
// Specify the endpoint of the region in which the bucket is located.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Specify the ID of the Alibaba Cloud region in which the bucket is located. 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 configured.
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// Specify the name of the bucket. Example: examplebucket.
String bucketName = "examplebucket";
// Specify the name of the output video.
String targetKey = "dest.avi";
// Specify the name of the source video.
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 {
// Create a style variable of the string type to store 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");
// Create an 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);
// Execute the asynchronous processing tasks.
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
Para usar o SDK do OSS para Python, certifique-se de que a versão do SDK seja V2.18.4 ou posterior.
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located 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 configured.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Specify the name of the bucket.
bucket_name = 'examplebucket'
# Specify the ID of the Alibaba Cloud region in which the bucket is located. Example: cn-hangzhou.
region = 'cn-hangzhou'
# Create a bucket.
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
# Specify the name of the source video.
source_key = 'src.mp4'
# Specify the name of the output video.
target_key = 'dest.avi'
# Create a style variable of the string type to store video transcoding parameters.
style = 'video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1'
process = "{0}|sys/saveas,o_{1}".format(style,
oss2.compat.to_string(base64.urlsafe_b64encode(
oss2.compat.to_bytes(target_key))).replace('=', ''))
# Call the media processing operation.
try:
# Run 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
Para usar o SDK do OSS para Go, certifique-se de que a versão do SDK seja V3.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 configured.
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Create an OSSClient instance.
// Specify the endpoint of the region in which the bucket is located. For example, if the bucket is located in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. Specify your 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 name of the bucket in which the source video is stored. Example: examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
// Specify the name of the output video.
targetObject := "dest.avi"
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Specify the name of the source video.
sourceObject := "src.mp4"
// Create a style variable of the string type to store video transcoding parameters.
style := "video/convert,f_avi,vcodec_h265,s_1920x1080,vb_2000000,fps_30,acodec_aac,ab_100000,sn_1"
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)
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)
}
Perguntas frequentes
Como corrigir um erro ResourceNotFound em uma tarefa de transcodificação de vídeo?
Para resolver o erro "ResourceNotFound: The specified resource Attachment is not found" durante a transcodificação de vídeo, verifique se um bucket de armazenamento foi criado e vinculado ao seu projeto do IMM. Para mais informações, consulte Guia de processamento de dados do OSS.
Posso salvar o objeto de saída de uma tarefa de transcodificação de vídeo no mesmo caminho do objeto de origem?
Não, não é possível salvar o objeto de saída no mesmo caminho do objeto de origem. Para evitar problemas como loops de execução de gatilhos ou substituição acidental do arquivo original, não utilize o caminho de entrada como prefixo do caminho de saída.
Posso especificar uma profundidade de bits de áudio em uma tarefa de transcodificação de vídeo?
Sim, é possível definir a profundidade de bits de áudio incluindo o parâmetro pixfmt em x-oss-process.
Como recupero o resultado da execução de uma tarefa de transcodificação de vídeo usando o ID da tarefa retornado?
Para obter o resultado da execução da tarefa usando o ID retornado, recomendamos chamar a operação GetTask no IMM.
Como o OSS lida com a recuperação e exclusão de objetos com formato específico baseado em sufixo durante a transcodificação de vídeo?
O OSS não oferece suporte à busca de objetos por sufixo, pois fornece um serviço de armazenamento não ordenado.
O que fazer se o envio de mensagens para transcodificação de vídeo estiver configurado, mas o backend não receber as mensagens?
Verifique se o tópico do SMQ foi criado e se a assinatura está configurada. Caso o tópico do SMQ não exista ou tenha sido excluído, reconfigure a assinatura. Reinicie o processo de transcodificação com base na configuração atual da assinatura.
Posso usar um modelo específico para transcodificar um vídeo após fazer upload dele no OSS?
Sim, configure um gatilho para implementar esse recurso. Tanto para vídeos existentes quanto para novos em um bucket, as tarefas de processamento podem ser iniciadas manual ou automaticamente por meio de configurações de processamento em lote e gatilhos. Ao criar tarefas, processadores em lote ou gatilhos, use estilos do sistema ou personalizados. Para mais informações, consulte Processamento em lote e Gatilhos.
Sou cobrado por taxas de armazenamento tanto do vídeo transcodificado quanto do vídeo original? Se o vídeo transcodificado tiver um prefixo diferente do original, ele substituirá o vídeo de origem?
Sim, as taxas de armazenamento incidem sobre ambos, pois o vídeo transcodificado também consome espaço. Se você utilizar o mesmo caminho para o vídeo transcodificado e o original, poderão ocorrer loops de processamento.