Tous les produits
Search
Centre de documentation

Object Storage Service:Concaténation vidéo

Dernière mise à jour :Aug 18, 2026

Fusionnez plusieurs vidéos stockées dans un bucket OSS en un seul fichier de sortie avec contrôle du transcodage. Cette opération s'exécute sous forme de tâche asynchrone via le SDK OSS ou l'API REST.

002

Cas d'utilisation

  • Production cinématographique et vidéo : Assemblez des plans et des scènes issus de différents clips pour créer une séquence narrative complète.

  • Contenus courts : Regroupez des extraits pour constituer des vlogs, des tutoriels ou des vidéos thématiques destinés aux réseaux sociaux.

  • Éducation et formation : Combinez des séquences théoriques et des démonstrations pratiques au sein d'une même vidéo pédagogique.

  • Temps forts sportifs : Montez des résumés à partir de multiples segments vidéo.

Fonctionnement

L'action video/concat concatène les vidéos selon l'ordre d'apparition des segments /pre et /sur dans la chaîne de traitement, puis transcode le résultat vers le format spécifié.

Tous les exemples de cette rubrique utilisent l'en-tête x-oss-async-process afin de soumettre la tâche comme un travail asynchrone.

Prérequis

Avant de commencer, assurez-vous d'avoir :

Limites

Prenez connaissance des contraintes suivantes avant de soumettre une tâche :

  • Traitement asynchrone uniquement : La concaténation vidéo ne prend en charge que le mode asynchrone (x-oss-async-process). Les requêtes synchrones ne sont pas supportées.

  • Nombre maximal de vidéos en entrée : Une seule tâche permet de concaténer jusqu'à 11 vidéos.

  • Accès anonyme : Les requêtes provenant d'utilisateurs anonymes sont rejetées.

  • Compatibilité des conteneurs : Lors de l'utilisation des fréquences d'échantillonnage audio ou du nombre de canaux par défaut, la concaténation peut échouer si ces valeurs sont incompatibles avec le conteneur cible. Spécifiez explicitement les valeurs ar et ac pour éviter ce problème.

  • Restrictions liées aux codecs et conteneurs : Consultez la section Paramètres de transcodage pour connaître les règles de compatibilité entre codecs et conteneurs.

Concaténer des vidéos

Utilisez Java SDK version 3.17.4 ou ultérieure, Python SDK version 2.18.4 ou ultérieure, ou Go SDK version 3.0.2 ou ultérieure.

Java

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 with the endpoint for the region where your bucket is located.
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // Specify the region ID, such as cn-hangzhou.
        String region = "cn-hangzhou";
        // Read credentials from environment variables OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Specify the bucket name.
        String bucketName = "examplebucket";
        // Specify the output video name.
        String targetObject = "dest.mp4";
        // Specify the source video (the main file used as the transcoding base).
        String sourceVideo = "src.mp4";
        // Specify the videos to prepend and append.
        String video1 = "concat1.mp4";
        String video2 = "concat2.mp4";

        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();

        try {
            // Base64 URL-safe encode the video object names (required by the /pre and /sur parameters).
            String video1Encoded = Base64.getUrlEncoder().withoutPadding().encodeToString(video1.getBytes());
            String video2Encoded = Base64.getUrlEncoder().withoutPadding().encodeToString(video2.getBytes());

            // Build the processing style string:
            // - /pre,o_<encoded>: prepend video1 to the beginning
            // - /sur,o_<encoded>,t_0: append video2 to the end (t_0 means use the full clip)
            // - Other parameters control the output encoding.
            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
            );

            // Append save-as and notification instructions.
            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
            );

            // Submit the asynchronous task.
            AsyncProcessObjectRequest request = new AsyncProcessObjectRequest(bucketName, sourceVideo, process);
            AsyncProcessObjectResult response = ossClient.asyncProcessObject(request);
            System.out.println("EventId: " + response.getEventId());
            System.out.println("RequestId: " + response.getRequestId());
            System.out.println("TaskId: " + response.getTaskId());
        } finally {
            ossClient.shutdown();
        }
    }
}

Python

# -*- coding: utf-8 -*-
import base64
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider

def main():
    # Read credentials from environment variables OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    # Replace with the endpoint for the region where your bucket is located.
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    region = 'cn-hangzhou'

    bucket = oss2.Bucket(auth, endpoint, 'examplebucket', region=region)

    # Specify the output video name.
    target_object = 'out.mp4'
    # Specify the source video (the main file used as the transcoding base).
    source_video = 'emrfinal.mp4'
    # Specify the videos to prepend and append.
    video1 = 'osshdfs.mp4'
    video2 = 'product.mp4'

    # Base64 URL-safe encode the video object names (required by the /pre and /sur parameters).
    video1_encoded = base64.urlsafe_b64encode(video1.encode()).decode().rstrip('=')
    video2_encoded = base64.urlsafe_b64encode(video2.encode()).decode().rstrip('=')

    # Build the processing style string:
    # - /pre,o_<encoded>: prepend video1 to the beginning
    # - /sur,o_<encoded>,t_0: append video2 to the end (t_0 means use the full clip)
    # - Other parameters control the output encoding.
    style = (
        f"video/concat,ss_0,f_mp4,vcodec_h264,fps_25,vb_1000000,acodec_aac,ab_96000,ar_48000,ac_2,align_1"
        f"/pre,o_{video1_encoded}/sur,o_{video2_encoded},t_0"
    )

    # Append save-as and notification instructions.
    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"

    # Submit the asynchronous 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

package main

import (
    "encoding/base64"
    "fmt"
    "os"
    "strings"

    "github.com/aliyun/aliyun-oss-go-sdk/oss"
)

func main() {
    // Read credentials from environment variables OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
    provider, err := oss.NewEnvironmentVariableCredentialsProvider()
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // Replace yourEndpoint with the endpoint for the region where your bucket is located,
    // and yourRegion with the corresponding region ID (e.g., 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)
    }

    bucketName := "examplebucket"
    bucket, err := client.Bucket(bucketName)
    if err != nil {
        fmt.Println("Error:", err)
        os.Exit(-1)
    }

    // Specify the output video name.
    targetObject := "dest.mp4"
    // Specify the source video (the main file used as the transcoding base).
    sourcevideo := "src.mp4"
    // Specify the videos to prepend and append.
    video1 := "concat1.mp4"
    video2 := "concat2.mp4"

    // Base64 URL-safe encode the video object names (required by the /pre and /sur parameters).
    encode := func(s string) string {
        return strings.TrimRight(base64.URLEncoding.EncodeToString([]byte(s)), "=")
    }

    // Build the processing style string:
    // - /pre,o_<encoded>: prepend video1 to the beginning
    // - /sur,o_<encoded>,t_0: append video2 to the end (t_0 means use the full clip)
    // - Other parameters control the output encoding.
    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",
        encode(video1), encode(video2),
    )

    // Append save-as and notification instructions.
    process := fmt.Sprintf(
        "%s|sys/saveas,b_%s,o_%s/notify,topic_QXVkaW9Db252ZXJ0",
        style, encode(bucketName), encode(targetObject),
    )

    // Submit the asynchronous task.
    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)
}

La réponse contient un TaskId. L'API ne retourne pas directement le résultat du traitement. Pour recevoir une notification de fin d'exécution, configurez Simple Message Queue (SMQ), anciennement MNS. Pour plus de détails, consultez Notifications de messages.

Pour plus de détails sur les paramètres sys/saveas et notify , consultez Enregistrer sous et Notifications de messages .

Référence des paramètres

Paramètres des clips

Les paramètres des clips se définissent pour chaque segment /pre ou /sur. Ils déterminent quelle portion de chaque clip sera utilisée avant la concaténation.

Paramètre Type Obligatoire Description
o string Oui Nom de l'objet OSS correspondant au clip. Doit être encodé en Base64 URL-safe.
ss int Non Décalage de début dans le clip, en millisecondes. La valeur 0 (par défaut) indique le début du clip.
t int Non Durée à extraire du clip, en millisecondes. La valeur 0 (par défaut) conserve le clip jusqu'à la fin.

Paramètres de transcodage

Les paramètres de transcodage se configurent au niveau de l'action (video/concat,...) et contrôlent l'encodage du fichier de sortie.

Vidéo

Paramètre Type Obligatoire Description
ss int Non Instant de début du transcodage pour la vidéo source, en millisecondes. La valeur 0 (par défaut) démarre depuis le début.
t int Non Durée du transcodage pour la vidéo source, en millisecondes. La valeur 0 (par défaut) traite la vidéo jusqu'à la fin.
f string Oui Format du conteneur de sortie. Valeurs valides : mp4, mkv, mov, asf, avi, mxf, ts, flv, webm.
vcodec string Oui Codec vidéo. Valeurs valides : h264, h265, vp9. Les formats mxf et flv ne prennent pas en charge h265.
vn int Non Désactive le flux vidéo. La valeur 0 (par défaut) conserve le flux vidéo. La valeur 1 le désactive.
fps float Non Fréquence d'images de sortie. Plage : 0–240. Par défaut, correspond à la fréquence d'images de la vidéo source sélectionnée par align.
fpsopt int Non Option de fréquence d'images lorsque la fréquence d'un clip source est inférieure à fps. 0 : toujours utiliser la fréquence cible. 1 : utiliser la fréquence source la plus basse. 2 : faire échouer la tâche. Nécessite le paramètre fps.
pixfmt string Non Format de pixel. Par défaut, correspond au format de la vidéo source sélectionnée par align. Valeurs valides : yuv420p, yuva420p, yuv420p10le, yuv422p, yuv422p10le, yuv444p, yuv444p10le.
s string Non Résolution de sortie au format w x h. La largeur et la hauteur doivent être des multiples de 2, comprises entre 64 et 4096. Exemple : 1920x1080.
sopt int Non Option de résolution lorsque la résolution d'un clip source est inférieure à s. 0 : toujours utiliser la résolution cible. 1 : utiliser la plus petite résolution source. 2 : faire échouer la tâche. Nécessite le paramètre s.
scaletype string Non Méthode de mise à l'échelle. stretch (par défaut) : étirer pour remplir. crop : mettre à l'échelle et recadrer. fill : mettre à l'échelle et ajouter des bandes noires. fit : ajuster sans remplissage.
arotate int Non Rotation automatique de la résolution basée sur les métadonnées d'orientation vidéo. 0 (par défaut) : désactivé. 1 : activé.
g int Non Taille du groupe d'images (GOP). Valeur par défaut : 150. Plage : 1–100000.
vb int Non Débit binaire vidéo, en bps. Plage : 10000–100000000. Mutuellement exclusif avec crf.
vbopt int Non Option de débit binaire vidéo lorsque le débit d'un clip source est inférieur à vb. 0 : toujours utiliser le débit cible. 1 : utiliser le débit source le plus bas. 2 : faire échouer la tâche. Nécessite le paramètre vb.
crf float Non Facteur de taux constant (CRF). Plage : 0–51. Des valeurs plus faibles produisent une qualité supérieure. Plage recommandée : 18–38. Mutuellement exclusif avec vb.
maxrate int Non Débit binaire maximal, en bps. Valeur par défaut : 0. Plage : 10000–100000000. Nécessite le paramètre crf.
bufsize int Non Taille du tampon, en bits. Valeur par défaut : 0. Plage : 10000–200000000. Nécessite le paramètre crf.

Audio

Paramètre Type Obligatoire Description
acodec string Oui Codec audio. Valeurs valides : mp3, aac, flac, vorbis, ac3, opus, pcm. Consultez les notes de compatibilité des codecs ci-dessous.
an int Non Désactive le flux audio. La valeur 0 (par défaut) conserve le flux audio. La valeur 1 le désactive.
ar int Non Fréquence d'échantillonnage audio, en Hz. Par défaut, correspond à la fréquence d'échantillonnage de la vidéo source sélectionnée par align. Valeurs valides : 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000.
ac int Non Nombre de canaux audio. Plage : 1–8. Par défaut, correspond au nombre de canaux de la vidéo source sélectionnée par align.
ab int Non Débit binaire audio, en bps. Plage : 1000–10000000. Mutuellement exclusif avec aq.
abopt string Non Option de débit binaire audio lorsque le débit audio d'un clip source est inférieur à ab. 0 (par défaut) : toujours utiliser le débit cible. 1 : utiliser le débit source le plus bas. 2 : faire échouer la tâche. Nécessite le paramètre ab.
aq int Non Qualité audio. Plage : 0–100. Mutuellement exclusif avec ab.
adepth int Non Profondeur de bits audio. Valeurs valides : 16, 24. Valide uniquement lorsque acodec est défini sur flac.
align int Non Index de la vidéo dans la liste de concaténation à utiliser comme source par défaut pour les paramètres de transcodage (fréquence d'images, résolution, fréquence d'échantillonnage, nombre de canaux). Valeur par défaut : 0 (le premier clip de la liste).

Compatibilité des codecs et des conteneurs :

Conteneur Codecs non pris en charge
mp4 pcm
mov flac, opus
asf opus
avi opus
mxf Tous les codecs audio sauf pcm (audio) ; h265 (vidéo)
ts flac, vorbis, amr, pcm
flv flac, vorbis, amr, opus, pcm
mxf, flv h265 (codec vidéo)

Contraintes de fréquence d'échantillonnage et de canaux par codec audio :

Codec Contraintes de fréquence d'échantillonnage Contraintes de canaux
mp3 48000 Hz et moins uniquement Mono ou stéréo uniquement
opus 8000, 12000, 16000, 24000, 48000 Hz —
ac3 32000, 44100, 48000 Hz Jusqu'à 6 canaux (5.1)
amr 8000, 16000 Hz uniquement Mono uniquement

Paramètres de segmentation

Utilisez l'action /segment pour diviser la sortie concaténée en segments HLS (HTTP Live Streaming) ou DASH (Dynamic Adaptive Streaming over HTTP). La segmentation prend uniquement en charge les conteneurs mp4 et ts.

Paramètre Type Obligatoire Description
f string Oui Format de segment. Valeurs valides : hls, dash.
t int Oui Longueur du segment, en millisecondes. Plage : 0–3600000.

Exemple : Concaténer trois clips dans un fichier MP4

Cet exemple concatène trois vidéos — pre.mov (clip entier), example.mkv (de la 10e seconde jusqu'à la fin), et sur.mov (les 10 premières secondes) — et enregistre le résultat sous oss://outbucket/outobj.mp4.

Paramètres de sortie : H.264, 25 fps, débit vidéo de 1 Mbps ; audio AAC, 48 kHz, deux canaux, 96 Kbps.

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

Correspondance entre la chaîne de style et l'exemple :

Segment Paramètre Valeur Signification
Action ss_10000 10000 ms Démarrer la vidéo source (example.mkv) à partir de la 10e seconde
Action align_1 1 Utiliser example.mkv (index 1 dans la liste) comme source pour les paramètres de transcodage
/pre o_cHJlLm1vdgo pre.mov (encodé) Ajouter l'intégralité de pre.mov au début
/sur o_c3VyMS5hYWMK sur.mov (encodé) Ajouter les 10 premières secondes de sur.mov à la fin
/sur t_10000 10000 ms Limiter sur.mov aux 10 premières secondes

Permissions

Un compte Alibaba Cloud dispose de toutes les permissions par défaut. Un utilisateur Resource Access Management (RAM) ou un rôle RAM nécessite des autorisations explicites accordées via une politique RAM ou une politique de bucket.

API Action Condition requise
GetObject oss:GetObject Toujours nécessaire pour lire les vidéos sources
GetObject oss:GetObjectVersion Nécessaire lors de l'accès à une version spécifique d'un objet
GetObject kms:Decrypt Nécessaire lorsque l'objet utilise le chiffrement côté serveur KMS
HeadObject oss:GetObject Nécessaire pour interroger les métadonnées de l'objet
PutObject oss:PutObject Nécessaire pour écrire la sortie concaténée
PutObject oss:PutObjectTagging Nécessaire lors de l'utilisation de x-oss-tagging
PutObject kms:GenerateDataKey, kms:Decrypt Nécessaire lorsque la sortie utilise le chiffrement KMS
CreateMediaConvertTask imm:CreateMediaConvertTask Nécessaire pour invoquer IMM afin d'effectuer le transcodage

Facturation

La concaténation vidéo sollicite à la fois OSS et IMM, ce qui génère des éléments facturables pour chacun de ces services.

Frais OSS (pour les tarifs, consultez Tarification OSS) :

API Élément facturable Notes
GetObject Requêtes GET Facturé par requête réussie
GetObject Trafic sortant Internet Facturé lors de l'utilisation d'un endpoint public (ex. : oss-cn-hangzhou.aliyuncs.com) ou d'un endpoint d'accélération
GetObject Récupération de données Accès peu fréquent (IA) Facturé lors de la récupération d'objets IA
GetObject Récupération de données Archive Facturé lors de la récupération d'objets Archive dans un bucket avec accès en temps réel activé
GetObject Accélération des transferts Facturé lorsque l'accélération des transferts est activée et qu'un endpoint d'accélération est utilisé
PutObject Requêtes PUT Facturé par requête réussie
PutObject Stockage Facturé selon la classe de stockage, la taille et la durée de conservation de l'objet de sortie
HeadObject Requêtes GET Facturé par requête réussie

Frais IMM (pour les tarifs, consultez Éléments facturables IMM) :

API Élément facturable Calcul
CreateMediaConvertTask Traitement multimédia ApsaraVideo Basé sur la définition et la durée réelle (en secondes) de la sortie concaténée

Étapes suivantes