O recurso de concatenação de vídeo permite combinar vários vídeos em um único arquivo e convertê-lo para um formato especificado.
Visão geral
A mesclagem de vídeo possibilita unir múltiplos clipes em um único arquivo de saída e convertê-lo para o formato desejado.

Casos de uso
Produção cinematográfica e televisiva: A mesclagem de vídeo é fundamental na produção de filmes, séries e curtas-metragens. Ela permite que editores combinem tomadas e cenas para construir uma narrativa completa.
Criação de conteúdo: Em plataformas de redes sociais, criadores utilizam a mesclagem para produzir vlogs, tutoriais ou compilações temáticas, tornando o conteúdo mais envolvente e atraente.
Educação e treinamento: Instrutores podem unir diversos clipes para criar materiais didáticos abrangentes que combinam teoria com exemplos práticos, melhorando a compreensão dos alunos.
Transmissão esportiva: No contexto esportivo, a mesclagem serve para criar compactos com os melhores momentos, permitindo que os espectadores revivam as jogadas mais emocionantes de uma partida.
Como usar
Pré-requisitos
Ative o service Intelligent Media Management (IMM). Para mais informações, consulte Activate a product.
Vincule um projeto do IMM. Para vincular um projeto no console do Object Storage Service (oss), consulte Step 1: Attach an IMM project. Para vincular um projeto por meio de uma operação de API, consulte AttachOSSBucket - Attach an oss bucket.
Concatenar vídeos
A concatenação de vídeos está disponível apenas via processamento assíncrono, utilizando os sdks Java, Python ou Go.
Java
Utilize o Java sdk versão 3.17.4 ou superior.
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 {
// Replace yourEndpoint with the Endpoint of the region where the bucket is located.
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// Specify a common Alibaba Cloud region ID, such as 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 bucket name.
String bucketName = "examplebucket";
// Specify the name of the concatenated video file.
String targetObject = "dest.mp4";
// Specify the name of the source video file.
String sourceVideo = "src.mp4";
// Specify the names of the video files to concatenate.
String video1 = "concat1.mp4";
String video2 = "concat2.mp4";
// Create an OSSClient instance.
// When the OSSClient instance is no longer used, call the shutdown method to release resources.
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// Encode the video file names.
String video1Encoded = Base64.getUrlEncoder().withoutPadding().encodeToString(video1.getBytes());
String video2Encoded = Base64.getUrlEncoder().withoutPadding().encodeToString(video2.getBytes());
// Build the video processing style string and the video concatenation parameters.
String style = String.format("video/concat,ss_0,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_%s/sur,o_%s,t_0", video1Encoded, video2Encoded);
// Build the asynchronous processing instruction.
String bucketEncoded = Base64.getUrlEncoder().withoutPadding().encodeToString(bucketName.getBytes());
String targetEncoded = Base64.getUrlEncoder().withoutPadding().encodeToString(targetObject.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, sourceVideo, 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.
ossClient.shutdown();
}
}
}
Python
Utilize o Python sdk versão 2.18.4 ou superior.
# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
def main():
# Obtain temporary 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())
# Replace the Endpoint with the one for the region where 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'
# Specify a common Alibaba Cloud region ID, such as cn-hangzhou.
region = 'cn-hangzhou'
# Specify the bucket name, such as examplebucket.
bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)
# Specify the name of the concatenated video.
target_object = 'out.mp4'
# Specify the name of the source video file.
source_video = 'emrfinal.mp4'
# Specify the names of the video files to concatenate.
video1 = 'osshdfs.mp4'
video2 = 'product.mp4'
# Build the video processing style string and the video concatenation parameters.
video1_encoded = base64.urlsafe_b64encode(video1.encode()).decode().rstrip('=')
video2_encoded = base64.urlsafe_b64encode(video2.encode()).decode().rstrip('=')
style = f"video/concat,ss_0,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_{video1_encoded}/sur,o_{video2_encoded},t_0"
# Build the asynchronous processing instruction.
bucket_encoded = base64.urlsafe_b64encode('examplebucket'.encode()).decode().rstrip('=')
target_encoded = base64.urlsafe_b64encode(target_object.encode()).decode().rstrip('=')
process = f"{style}|sys/saveas,b_{bucket_encoded},o_{target_encoded}/notify,topic_QXVkaW9Db252ZXJ0"
print(process)
# Execute the asynchronous processing task.
try:
result = bucket.async_process_object(source_video, 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
Utilize o Go sdk versão 3.0.2 ou superior.
package main
import (
"encoding/base64"
"fmt"
"os"
"strings"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Obtain temporary 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.
// Replace yourEndpoint with the Endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the Endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, specify the actual Endpoint.
// Replace yourRegion with a common Alibaba Cloud region ID, such as cn-hangzhou.
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider), oss.AuthVersion(oss.AuthV4), oss.Region("yourRegion"))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Specify the bucket name, such as examplebucket.
bucketName := "examplebucket"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Specify the name of the concatenated video file.
targetObject := "dest.mp4"
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// Specify the name of the source video file.
sourcevideo := "src.mp4"
// Specify the names of the video files to concatenate.
video1 := "concat1.mp4"
video2 := "concat2.mp4"
// Build the video processing style string and the video concatenation parameters.
style := fmt.Sprintf("video/concat,ss_0,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_%s/sur,o_%s,t_0", strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(video1)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(video2)), "="))
// Build the asynchronous processing instruction.
process := fmt.Sprintf("%s|sys/saveas,b_%v,o_%v/notify,topic_QXVkaW9Db252ZXJ0", style, strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(bucketName)), "="), strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(targetObject)), "="))
fmt.Printf("%#v\n", process)
rs, err := bucket.AsyncProcessObject(sourcevideo, 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)
}
Solicitações de processamento assíncrono não retornam os resultados diretamente. Para obter os resultados de uma tarefa assíncrona, utilize o Simple Message Queue (SMQ), anteriormente conhecido como MNS. Para mais informações, consulte Message notifications.
Descrição dos parâmetros
Ação: video/concat
A tabela a seguir descreve os parâmetros disponíveis.
Parâmetros de concatenação
A operação video/concat concatena os vídeos na ordem em que pre e sur aparecem na string de solicitação. Detalhes:
/pre: Arquivo de vídeo a ser concatenado no início./sur: Arquivo de vídeo a ser concatenado no final.
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
ss |
int |
Não |
Tempo inicial para concatenar o vídeo de prefixo ou sufixo, em milissegundos. Valores válidos:
|
|
t |
int |
Não |
Duração para concatenar o vídeo de prefixo ou sufixo, em milissegundos. Valores válidos:
|
|
o |
string |
Sim |
Objeto do oss no bucket atual. O nome do objeto deve estar codificado em Base64 URL-safe. |
Parâmetros de transcodificação
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
ss |
int |
Não |
Tempo inicial de transcodificação para o vídeo sendo concatenado, em milissegundos. Valores válidos:
|
|
t |
int |
Não |
Duração da transcodificação para o vídeo sendo concatenado, em milissegundos. Valores válidos:
|
|
f |
string |
Sim |
Contêiner de vídeo. Valores válidos:
|
|
vn |
int |
Não |
Define se o fluxo de vídeo deve ser desativado. Valores válidos:
|
|
vcodec |
string |
Sim |
Codec de vídeo (formato de codificação). Valores válidos:
Nota
Os formatos mxf e flv não suportam H.265. |
|
fps |
float |
Não |
Taxa de quadros do vídeo. Por padrão, este parâmetro assume o mesmo valor do vídeo fonte especificado por align. Intervalo de valores: 0 a 240. |
|
fpsopt |
int |
Não |
Opção de taxa de quadros do vídeo. Valores válidos:
Nota
Configure este parâmetro juntamente com fps. |
|
pixfmt |
string |
Não |
Formato de amostragem de pixels. Por padrão, este parâmetro assume o mesmo valor do vídeo fonte especificado por align. Valores válidos:
|
|
s |
string |
Não |
Resolução.
|
|
sopt |
int |
Não |
Opção de resolução. Valores válidos:
Nota
Configure este parâmetro juntamente com s. |
|
scaletype |
string |
Não |
Método de redimensionamento. Valores válidos:
|
|
arotate |
int |
Não |
Rotação automática da orientação da resolução. Valores válidos:
|
|
g |
int |
Não |
Tamanho do Grupo de Imagens (GOP). Valor padrão: 150. Intervalo válido: 1 a 100000. |
|
vb |
int |
Não |
Taxa de bits do vídeo, em bits por segundo (bps). Intervalo válido: 10000 a 100000000. Nota
Este parâmetro é mutuamente exclusivo com crf. Eles representam algoritmos diferentes de controle de taxa de bits. Se nenhum dos dois for definido, o vídeo será codificado com a taxa de bits padrão para a resolução de saída. |
|
vbopt |
int |
Não |
Opção de taxa de bits do vídeo. Valores válidos:
Nota
Configure este parâmetro juntamente com vb. |
|
crf |
float |
Não |
Fator de taxa constante. Intervalo de valores: 0 a 51. Um valor maior indica menor qualidade de imagem. Recomenda-se um valor entre 18 e 38. |
|
maxrate |
int |
Não |
Taxa máxima de bits, em bits por segundo (bps). Valor padrão: 0. Intervalo válido: 10000 a 100000000. Nota
Configure este parâmetro juntamente com crf. |
|
bufsize |
int |
Não |
Tamanho do buffer, em bits. Valor padrão: 0. Intervalo válido: 10000 a 200000000. Nota
Configure este parâmetro juntamente com crf. |
|
an |
int |
Não |
Define se o fluxo de áudio deve ser desativado. Valores válidos:
|
|
acodec |
string |
Sim |
Codec de áudio (formato de codificação). Valores válidos:
Nota
O formato mp4 não suporta pcm. O formato mov não suporta flac ou opus. O formato asf não suporta opus. O formato avi não suporta opus. O formato mxf suporta apenas pcm. O formato ts não suporta flac, vorbis, amr ou pcm. O formato flv não suporta flac, vorbis, amr, opus ou pcm. |
|
ar |
int |
Não |
Taxa de amostragem de áudio. Por padrão, este parâmetro assume o mesmo valor do vídeo fonte especificado por align. Valores válidos:
Nota
As taxas de amostragem suportadas variam conforme o formato. O mp3 suporta apenas 48 kHz ou menos. O opus suporta 8 kHz, 12 kHz, 16 kHz, 24 kHz e 48 kHz. O ac3 suporta 32 kHz, 44,1 kHz e 48 kHz. O amr suporta apenas 8 kHz e 16 kHz. |
|
ac |
int |
Não |
Número de canais de som. Por padrão, este parâmetro assume o mesmo valor do vídeo fonte especificado por align. Intervalo válido: 1 a 8. Nota
O número de canais suportados varia conforme o formato. O mp3 suporta apenas mono e estéreo. O ac3 suporta até 6 canais (5.1). O amr suporta apenas mono. |
|
aq |
int |
Não |
Qualidade de compressão de áudio. Intervalo de valores: 0 a 100. Nota
Este parâmetro é mutuamente exclusivo com ab. Se nenhum dos dois for definido, o áudio será codificado com a taxa de bits padrão do codificador. |
|
ab |
int |
Não |
Taxa de bits do áudio, em bits por segundo (bps). Intervalo válido: 1000 a 10000000. |
|
abopt |
string |
Não |
Opção de taxa de bits do áudio. Valores válidos:
Nota
Configure este parâmetro juntamente com ab. |
|
align |
int |
Não |
Número ordinal do arquivo de vídeo principal (que fornece os parâmetros padrão de transcodificação) na lista de concatenação. Valor padrão: 0 (correspondente ao primeiro arquivo de vídeo da lista). |
|
adepth |
int |
Não |
Profundidade de bits da amostragem de áudio. Valores válidos: 16 ou 24. Nota
Este parâmetro é válido apenas quando acodec estiver definido como flac. |
A concatenação de vídeo também utiliza os parâmetros sys/saveas e notify. Para mais informações, consulte Save as e Message notifications.
Parâmetros de fragmentação de mídia
/segment: Parâmetros de fragmentação
|
Parâmetro |
Tipo |
Obrigatório |
Descrição |
|
f |
string |
Sim |
Formato de fragmentação. Valores válidos:
|
|
t |
int |
Sim |
Comprimento do fragmento, em milissegundos. Intervalo válido: 0 a 3600000. |
A fragmentação de mídia suporta apenas os contêineres mp4 e ts.
Operações de API relacionadas
Concatenar vídeos em um arquivo MP4
Informações de concatenação
Nomes dos vídeos fonte: pre.mov, example.mkv, sur.mov
-
Duração e ordem de concatenação:
Nome do vídeo
Ordem
Duração
pre.mov
1
Vídeo inteiro
example.mkv
2
Do décimo segundo até o fim
sur.mov
3
Do início até o décimo segundo
Notificação de conclusão da transcodificação: Uma mensagem MNS é enviada.
-
Informações do vídeo concatenado
Formato de vídeo: h264
Taxa de quadros: 25 fps
Taxa de bits do vídeo: 1 Mbps
Formato de áudio: aac
Configuração de áudio: Taxa de amostragem de 48 kHz, canal duplo
Taxa de bits do áudio: 96 Kbps
-
Caminho de armazenamento do arquivo
Arquivo MP4: oss://outbucket/outobj.mp4
Exemplo de processamento
// Concatenate the video file example.mkv.
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/concat,ss_10000,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1/pre,o_cHJlLm1vdgo/sur,o_c3VyMS5hYWMK,t_10000|sys/saveas,b_b3V0YnVja2V0,o_b3V0b2JqLnthdXRvZXh0fQo/notify,topic_QXVkaW9Db252ZXJ0
Permissões
Uma conta Alibaba Cloud possui todas as permissões por padrão. Um usuário ou função do Resource Access Management (ram) não possui permissões por padrão. Conceda permissões ao usuário ou função ram usando uma ram policy ou uma bucket policy.
|
API |
Ação |
Descrição |
|
GetObject |
|
Baixa um objeto. |
|
|
Necessária ao baixar um objeto caso a versão seja especificada via versionId. |
|
|
|
Necessária ao baixar um objeto cujos metadados contenham X-Oss-Server-Side-Encryption: KMS. |
|
API |
Ação |
Descrição |
|
HeadObject |
|
Consulta os metadados de um objeto. |
|
API |
Ação |
Descrição |
|
PutObject |
|
Carrega um objeto. |
|
|
Necessária se tags de objeto forem especificadas via cabeçalho |
|
|
|
Necessária se o cabeçalho |
|
|
|
|
API |
Ação |
Descrição |
|
CreateMediaConvertTask |
|
Permissão para usar o IMM na transcodificação de mídia. |
Faturamento
Durante a concatenação de vídeo, como o service IMM é chamado, itens faturáveis são gerados tanto para o oss quanto para o IMM. Detalhes:
-
No oss: Chame a operação GetObject e adicione o parâmetro x-oss-async-process para concatenar os vídeos. Também chame a operação HeadObject para recuperar os metadados do objeto. Após a concatenação, a operação PutObject carrega o vídeo gerado no bucket. Os seguintes itens faturáveis são gerados. Para preços detalhados, consulte Preços do oss:
API
Item faturável
Descrição
GetObject
Solicitações GET
Taxas de solicitação cobradas com base no número de solicitações bem-sucedidas.
Tráfego de saída pela Internet
Ao chamar a operação GetObject usando um endpoint público, como oss-cn-hangzhou.aliyuncs.com, ou um endpoint de aceleração, como oss-accelerate.aliyuncs.com, há cobrança de tráfego de saída pela Internet baseada no tamanho dos dados.
Recuperação de objetos IA
Se objetos IA forem recuperados, há cobrança de taxas de recuperação de dados IA baseada no tamanho dos dados recuperados.
Recuperação de objetos Archive em bucket com acesso em tempo real ativado
Ao recuperar objetos Archive em um bucket com acesso em tempo real ativado, há cobrança de taxas de recuperação de dados Archive baseada no tamanho dos objetos recuperados.
Taxas de aceleração de transferência
Se a aceleração de transferência estiver ativada e um endpoint de aceleração for usado para acessar o bucket, há cobrança de taxas de aceleração de transferência baseada no tamanho dos dados.
API
Item faturável
Descrição
PutObject
Solicitações PUT
Taxas de solicitação cobradas com base no número de solicitações bem-sucedidas.
Taxas de armazenamento
Taxas de armazenamento cobradas com base na classe de armazenamento, tamanho e duração de armazenamento do objeto.
API
Item faturável
Descrição
HeadObject
Solicitações GET
Taxas de solicitação cobradas com base no número de solicitações bem-sucedidas.
-
No IMM: Os seguintes itens faturáveis são gerados. Para preços detalhados, consulte IMM billable items:
API
Item faturável
Descrição
CreateMediaConvertTask
Taxas de Processamento de Mídia ApsaraVideo
As taxas de Processamento de Mídia ApsaraVideo são calculadas com base na definição e na duração real (em segundos) do vídeo concatenado.
Observações
A concatenação de vídeo suporta apenas processamento assíncrono (utilizando o método x-oss-async-process).
O acesso anônimo será negado.
Ao transcodificar com taxa de amostragem ou número de canais de som padrão, a concatenação pode falhar devido a problemas de compatibilidade com o contêiner de vídeo alvo.
É possível concatenar no máximo 11 vídeos por vez.