Tous les produits
Search
Centre de documentation

Intelligent Media Management:Transcode while streaming

Dernière mise à jour :Aug 10, 2026

Le transcodage à la volée est une fonctionnalité de transcodage en temps réel destinée à la lecture vidéo en ligne. Elle permet de démarrer la lecture immédiatement après le chargement et ne transcode que les segments en cours de visionnage.

Présentation

Contrairement à ApsaraVideo Media Processing, qui impose d'attendre la fin du transcodage complet de la vidéo après son chargement avant de pouvoir lancer la lecture, le transcodage à la volée démarre la lecture dès que le chargement de la vidéo source est terminé. Seuls les segments vidéo nécessaires à la lecture sont transcodés. Cette approche offre les avantages suivants :

  • Transcodage pendant la lecture : aucune attente requise.

  • Transcodage optimisé avec des temps de démarrage et de recherche inférieurs à la seconde : expérience de lecture quasi locale.

  • Aucun transcodage sans lecture. Même si les fichiers transcodés sont supprimés, ils peuvent être régénérés à la demande : réduction significative des coûts de transcodage et de stockage.

  • Prise en charge de dizaines de paramètres de transcodage : paramètres hautement personnalisables.

  • Compatibilité élevée : prend en charge plus de 300 formats audio et vidéo.

Remarque

Le transcodage à la volée ne prend pas en charge la lecture anonyme.

Flux de travail

  1. Chargez votre fichier vidéo dans Object Storage Service (OSS).

  2. Utilisez l'API GenerateVideoPlaylist pour générer rapidement un fichier de liste de lecture multimédia. Signez la liste de lecture à l'aide des fonctionnalités de signature OSS afin d'obtenir une URL signée.

  3. Le lecteur récupère la liste de lecture signée et démarre la lecture. La fonctionnalité de transcodage à la volée se déclenche automatiquement pendant la lecture.

Scénarios

  • Stockage cloud : les utilisateurs chargent des vidéos sur des lecteurs cloud. Les clients sélectionnent instantanément les résolutions appropriées en fonction des conditions réseau pour la lecture. Cela garantit une lecture en temps réel et une compatibilité multi-appareils. Étant donné que la plupart des vidéos stockées dans le cloud sont rarement consultées (« froides »), le transcodage à la volée évite de transcoder le contenu non lu, ce qui réduit considérablement les coûts de transcodage et de stockage.

  • Aperçus vidéo dans les applications de chat : dans les messageries instantanées ou les plateformes sociales, dès que l'expéditeur termine le chargement (et que le serveur reçoit le fichier), le destinataire peut démarrer la lecture immédiatement, améliorant ainsi la communication en temps réel. Les fichiers transcodés pour les messages historiques non consultés depuis longtemps peuvent être nettoyés périodiquement pour réduire les coûts de stockage, et la lecture reste instantanée lors d'un nouvel accès.

  • Forums en ligne et blogs : après que les utilisateurs ont chargé des vidéos sources pour les partager, les autres peuvent immédiatement lire les versions transcoded, garantissant une lecture fluide, une haute définition et une large compatibilité des formats.

Fonctionnalités

Le tableau suivant décrit les fonctionnalités supplémentaires.

Fonctionnalité

Description

Normalisation

  • Prend en charge le protocole standard HTTP Live Streaming (HLS).

  • Prend en charge la génération de listes de lecture multimédia et de listes de lecture principales.

  • Prend en charge la lecture de flux vidéo multiples, de flux audio multiples et de flux de sous-titres multiples.

  • Compatible avec les lecteurs HLS grand public.

  • Prend en charge plus de 300 formats audio et vidéo grand public.

Coût réduit

  • Les vidéos et segments non lus ne sont pas transcodés, ce qui réduit les coûts de transcodage.

  • Les segments vidéo transcodés peuvent être supprimés pour économiser les coûts de stockage. Lors d'une relecture, le système déclenche automatiquement un nouveau transcodage pour maintenir une lecture fluide.

Haute efficacité

  • Des clusters à grande échelle prennent en charge le transcodage en temps réel.

  • Fournit plusieurs flux vidéo avec différentes résolutions et débits binaires pour s'adapter aux différentes conditions réseau et garantir une lecture fluide.

  • La lecture démarre immédiatement après la génération de la liste de lecture, sans attendre la fin du transcodage complet.

  • La taille adaptative des segments pour les en-têtes vidéo permet un chargement initial plus rapide.

  • Pré-transcodage intelligent.

Formats audio et vidéo pris en charge

Le transcodage à la volée prend en charge plus de 300 formats audio et vidéo. Le tableau suivant répertorie certains des formats couramment pris en charge.

Formats vidéo d'entrée

avi, mov, flv, mkv, webm, mpeg, wmv, rm, vob, ts et tous les autres formats grand public

Formats audio d'entrée

mp3, wav, aac, flac, wma et tous les autres formats grand public

Format de conteneur de sortie

ts

Prérequis

  1. Créez et obtenez un AccessKey.

  2. Activez OSS, créez un bucket et chargez-y des fichiers. Pour plus de détails, consultez la section Démarrage rapide dans la console.

  3. Activez Intelligent Media Management (IMM) et créez un projet. Pour plus de détails, consultez les sections Activation du service et Création d'un projet.

    Remarque

    Vous pouvez également appeler l'API CreateProject pour créer un projet.

    Vous pouvez appeler l'API ListProjects pour répertorier tous les projets dans une région spécifiée.

  4. Accordez à votre utilisateur Resource Access Management (RAM) les autorisations requises pour les opérations IMM.

  5. Avant d'utiliser le transcodage à la volée, associez un projet IMM. Pour obtenir des instructions sur l'association via la console ou l'API, consultez les sections Démarrage rapide et Association d'un bucket OSS.

  6. Si la protection contre le hotlinking est activée sur le bucket contenant vos vidéos sources ou de sortie, assurez-vous que votre politique de protection contre le hotlinking autorise le Referer vide.

  7. Si votre lecteur nécessite un accès inter-domaines à OSS, activez le partage de ressources cross-origin (CORS) d'OSS pour le bucket cible. Consultez la section Paramètres CORS.

Utilisation

Exemple de liste de lecture multimédia

Configuration du transcodage

  • Informations sur la vidéo source

    • Format : AVI

    • URI source : oss://your-oss-bucket-name/test.avi

  • Vidéo cible

    • Durée du segment : 10 secondes

    • Durée de pré-transcodage : 36 secondes

    • Codec vidéo : H.264

    • Résolution : 1280×720

    • Fréquence d'images : 25 ips

    • Débit binaire vidéo : 2 Mbps

    • Codec audio : AAC

    • Débit binaire audio : 128 Kbps

    • Préfixe du chemin de sortie : oss://your-oss-bucket-name/output/media

Étape 1 : Générer la liste de lecture

Remarque

Reportez-vous à la documentation de l'API Génération d'une liste de lecture pour le transcodage à la volée.

  • Exemple de requête

    {
      "ProjectName": "test-project",
      "SourceURI": "oss://your-oss-bucket-name/test.avi",
      "Targets": [
        {
          "Audio": {
            "TranscodeAudio": {
              "Codec": "aac",
              "Bitrate": 128000,
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/media",
          "Video": {
            "TranscodeVideo": {
              "Codec": "h264",
              "Bitrate": 2400000,
              "FrameRate": 25,
              "Resolution": "1280x",
              "ScaleType": "fit"
            }
          }
        }
      ]
    }
  • Exemple de réponse

    {
      "RequestId": "********-3ADC-576A-BD1E-************",
      "VideoPlaylist": [
        {
          "FrameRate": "25",
          "Resolution": "1280x720",
          "Token": "3d8ca7d6b3**********4b3cb69fe3bf",
          "URI": "oss://your-oss-bucket-name/output/media.m3u8"
        }
      ]
    }
    
  • Exemple de code

    # -*- coding: utf-8 -*-
    import json
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    class Sample:
        def __init__(self):
            pass
        @staticmethod
        def create_client(
                access_key_id: str,
                access_key_secret: str,
        ) -> imm20200930Client:
            """
            Initialize a client using AccessKey ID and AccessKey secret.
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # Your AccessKey ID.
                access_key_id=access_key_id,
                # Your AccessKey secret.
                access_key_secret=access_key_secret
            )
            # IMM endpoint.
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
        @staticmethod
        def main() -> None:
            # Use IMM AccessKey ID and secret. Read from configuration if possible.
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
            # Project name.
            project_name = "test-project"
            # Source video OSS URI.
            source_uri = "oss://your-oss-bucket-name/test.avi"
            # Target URI.
            target_uri = "oss://your-oss-bucket-name/output/media"
            # Initialize client.
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
            # Create target.
            target = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=128000,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        bitrate=2400000,
                        frame_rate=25,
                        resolution="1280x",
                        scale_type="fit",
                    )
                ),
            )
            # Create API request.
            req = imm_20200930_models.GenerateVideoPlaylistRequest(
                project_name=project_name,
                source_uri=source_uri,
                targets=[target]
            )
            # Print request.
            print(json.dumps(req.to_map(), indent=4))
            # Send request.
            response = client.generate_video_playlist(req)
            # Print response.
            print(json.dumps(response.body.to_map(), indent=4))
    if __name__ == '__main__':
        Sample.main()
    
    package main
    import (
    	"fmt"
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	imm "github.com/alibabacloud-go/imm-20200930/v2/client"
    	"github.com/alibabacloud-go/tea/tea"
    )
    func main() {
    	// Initialize IMM client.
    	immClient, err := imm.NewClient(&openapi.Config{
    		RegionId:        tea.String("cn-hangzhou"),            // Region ID of your project.
    		AccessKeyId:     tea.String("your_access_key_id"),     // RAM user AccessKey ID.
    		AccessKeySecret: tea.String("your_access_key_secret"), // RAM user AccessKey secret.
    	})
    	if err != nil {
    		// Handle error.
    		panic(err)
    	}
    	// Project name.
    	projectName := "test-project"
    	// Video OSS URI.
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    	// Target URI.
    	targetUri := "oss://your-oss-bucket-name/output/media"
    	target := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(98304),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(targetUri),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				Bitrate:    tea.Int32(2400000),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1280x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	// Create API request.
    	req := &imm.GenerateVideoPlaylistRequest{
    		ProjectName: tea.String(projectName),
    		SourceURI:   tea.String(sourceUri),
    		Targets:     []*imm.GenerateVideoPlaylistRequestTargets{target},
    	}
    	// Send request.
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    	// Print response.
    	fmt.Println("Response:", *res.Body)
    }
    // This file is auto-generated, don't edit it. Thanks.
    package com.aliyun.sample;
    import com.aliyun.tea.*;
    public class Sample {
        /**
         * description :
         * <p>Initialize client using AK&amp;SK</p>
         * @return Client
         * 
         * @throws Exception
         */
        public static com.aliyun.teaopenapi.Client createClient() throws Exception {
            // Leaking credentials may compromise all resources under your account. This example is for reference only.
            // Use STS for better security. See https://www.alibabacloud.com/help/document_detail/378657.html for more options.
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    // Required. Ensure ALIBABA_CLOUD_ACCESS_KEY_ID is set as an environment variable.
                    .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                    // Required. Ensure ALIBABA_CLOUD_ACCESS_KEY_SECRET is set as an environment variable.
                    .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
            // Endpoint: https://api.aliyun.com/product/imm
            config.endpoint = "imm.cn-beijing.aliyuncs.com";
            return new com.aliyun.teaopenapi.Client(config);
        }
        /**
         * description :
         * <p>API info</p>
         * 
         * @param path string Path parameters
         * @return OpenApi.Params
         */
        public static com.aliyun.teaopenapi.models.Params createApiInfo() throws Exception {
            com.aliyun.teaopenapi.models.Params params = new com.aliyun.teaopenapi.models.Params()
                    // API name
                    .setAction("GenerateVideoPlaylist")
                    // API version
                    .setVersion("2020-09-30")
                    // Protocol
                    .setProtocol("HTTPS")
                    // HTTP method
                    .setMethod("POST")
                    .setAuthType("AK")
                    .setStyle("RPC")
                    // Path
                    .setPathname("/")
                    // Request body format
                    .setReqBodyType("json")
                    // Response body format
                    .setBodyType("json");
            return params;
        }
        public static void main(String[] args_) throws Exception {
            java.util.List<String> args = java.util.Arrays.asList(args_);
            com.aliyun.teaopenapi.Client client = Sample.createClient();
            com.aliyun.teaopenapi.models.Params params = Sample.createApiInfo();
            // Query parameters
            java.util.Map<String, Object> queries = new java.util.HashMap<>();
            queries.put("ProjectName", "test-project");
            queries.put("SourceURI", "oss://your-oss-bucket-name/test.avi");
            queries.put("Targets", "[{\"Video\":{\"TranscodeVideo\":{\"Codec\":\"h264\",\"Bitrate\":128000,\"FrameRate\":25,\"Resolution\":\"1280x\"}},\"Audio\":{\"TranscodeAudio\":{\"SampleRate\":44100,\"Codec\":\"aac\",\"Bitrate\":2400000}},\"Duration\":10,\"InitialSegments\":[2,2,2],\"InitialTranscode\":36,\"URI\":\"oss://your-oss-bucket-name/output/media\"}]");
            // Runtime options
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            com.aliyun.teaopenapi.models.OpenApiRequest request = new com.aliyun.teaopenapi.models.OpenApiRequest()
                    .setQuery(com.aliyun.openapiutil.Client.query(queries));
            // Run and print API response.
            // Response is a Map containing body, headers, and statusCode.
            client.callApi(params, request, runtime);
        }
    }

Étape 2 : Signer la liste de lecture

# -*- coding: utf-8 -*-
import os
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# Get credentials from environment variables. Configure them before running.
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# Endpoint for your bucket's region.
endpoint = 'yourEndpoint'
# Region ID, e.g., cn-hangzhou.
region = 'cn-hangzhou'
# Bucket name.
bucket_name = 'your-oss-bucket-name'
# Playlist name.
key = 'output/media.m3u8'
# Create bucket instance.
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region) 
# Set x-oss-process to hls/sign,live_1.
params = {}
params.update({oss2.Bucket.PROCESS: 'hls/sign,live_1'})
# Generate signed URL.
url = bucket.sign_url('GET', key, 7200, params=params, slash_safe=True)
# Use this URL directly in an HLS player.
print(url)
# Example URL: http://your-oss-bucket-name.yourendpoint/output/media.m3u8?x-oss-process=hls%2Fsign%2Clive_1&x-oss-signature-version=OSS2&x-oss-expires=1683619052&x-oss-access-key-id=yourAccessKeyId&x-oss-signature=4Lja6Sgb7zXWzY9R9QTRe4FxI240fApDavp%2BSMj3ufg%3D
package main
import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"net/http"
	"net/url"
	"os"
	"strings"
)
func main() {
	// Get credentials from environment variables. Configure them before running.
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Create OSS client.
	// yourEndpoint: e.g., https://oss-cn-hangzhou.aliyuncs.com for China (Hangzhou).
	// yourRegion: 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)
	}
	// Bucket name.
	bucket, err := client.Bucket("your-oss-bucket-name")
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Use oss hls/sign. "hls/sign,live_1" enables transcode while streaming.
	// Full path to m3u8, e.g., output/media.m3u8.
	// Signature validity: 7200 seconds (2 hours).
	signedURL, err := bucket.SignURL("output/media.m3u8", http.MethodGet, 7200, oss.Process("hls/sign,live_1"))
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	// Format for player use.
	rawUrl, err := url.Parse(signedURL)
	if err != nil {
		fmt.Println("Error:", err)
		os.Exit(-1)
	}
	rawUrl.RawPath = strings.Replace(rawUrl.RawPath, "%2F", "/", -1)
	// Print signed URL.
	fmt.Println(rawUrl.String())
	// Paste this URL into an HLS player.
	//http://your-oss-bucket-name.yourEndpoint/output/media.m3u8?x-oss-access-key-id=yourAccessKeyId&x-oss-expires=1683618084&x-oss-process=hls%2Fsign%2Clive_1&x-oss-signature=%2BqTZ0R04Ft065gdyoP6f9yJdd1UXi%2F8eoxd9c9Stl2g%3D&x-oss-signature-version=OSS2
}
package com.aliyun.sample;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import java.net.URL;
import java.util.Date;
public class demo {
    public static void main(String[] args) throws Throwable {
        // Endpoint example: https://oss-cn-beijing.aliyuncs.com. Adjust for your region.
        String endpoint = "https://oss-cn-beijing.aliyuncs.com";
        String region = "cn-beijing";
        // Get credentials from environment variables OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                // Required. Ensure ALIBABA_CLOUD_ACCESS_KEY_ID is set.
                .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
                // Required. Ensure ALIBABA_CLOUD_ACCESS_KEY_SECRET is set.
                .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // Bucket name.
        String bucketName = "test-project";
        // Object path (exclude bucket name).
        String objectKey = "output/media.m3u8";
        // Create OSS client.
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
        // Set URL expiration (2 hours).
        Date expiration = new Date(new Date().getTime() + 7200 * 1000);
        GeneratePresignedUrlRequest request=new GeneratePresignedUrlRequest(bucketName, objectKey, HttpMethod.GET);
        request.setExpiration(expiration);
        request.setProcess("hls/sign,live_1");
        // Generate signed URL.
        URL signedUrl = ossClient.generatePresignedUrl(request);
        // Print URL.
        System.out.println(signedUrl);
        // Close OSS client.
        ossClient.shutdown();         
        try {
            // Example: 1-hour expiration.
            URL url = ossClient.generatePresignedUrl(bucketName, objectKey, expiration);
            System.out.println(url);
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException. Request reached OSS but was rejected.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught a ClientException. Client encountered a serious internal issue.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

Étape 3 : Lire la vidéo

Collez l'URL signée obtenue à l'étape Étape 2 : Signer la liste de lecture directement dans un lecteur HLS.

  • Lecture dans Safari sur Mac

    Safari sur macOS prend en charge la lecture HLS. Collez l'URL dans la barre d'adresse.

  • Lecture avec Aliplayer

    Ouvrez le Alibaba Cloud Aliplayer et collez l'URL dans la barre d'adresse.

    Remarque

    Vous pouvez également intégrer le SDK ApsaraVideo Player dans votre application. Consultez la section Présentation du lecteur Web.

  • Lecture avec un lecteur HLS

    Collez l'URL signée dans n'importe quel lecteur compatible HLS.

Exemple de liste de lecture principale

Configuration du transcodage

  • Vidéo source

    • Format : AVI

    • URI source : oss://your-oss-bucket-name/test.avi

  • URI de la liste de lecture principale : oss://your-oss-bucket-name/output/master.m3u8

  • Vidéo cible 1

    • Durée du segment : 10 secondes

    • Durée de pré-transcodage : 36 secondes

    • Codec vidéo : H.264

    • Résolution : 1920×1080

    • Fréquence d'images : 25 ips

    • Codec audio : AAC

    • Débit binaire audio : 128 Kbps

    • Préfixe du chemin de sortie : oss://your-oss-bucket-name/output/1080p/1080p

  • Vidéo cible 2

    • Durée du segment : 10 secondes

    • Durée de pré-transcodage : 36 secondes

    • Codec vidéo : H.264

    • Résolution : 1280×720

    • Fréquence d'images : 25 ips

    • Codec audio : AAC

    • Débit binaire audio : 96 Kbps

    • Préfixe du chemin de sortie : oss://your-oss-bucket-name/output/720p/720p

  • Vidéo cible 3

    • Durée du segment : 10 secondes

    • Durée de pré-transcodage : 36 secondes

    • Codec vidéo : H.264

    • Résolution : 720×540

    • Fréquence d'images : 25 ips

    • Codec audio : AAC

    • Débit binaire audio : 64 Kbps

    • Préfixe du chemin de sortie : oss://your-oss-bucket-name/output/540p/540p

Étape 1 : Générer la liste de lecture

  • Exemple de requête

    {
      "MasterURI": "oss://your-oss-bucket-name/output/master.m3u8",
      "ProjectName": "test-project",
      "SourceSubtitles": [],
      "SourceURI": "oss://your-oss-bucket-name/test.avi",
      "Targets": [
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 131072,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/1080p/1080p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "1920x",
              "ScaleType": "fit"
            }
          }
        },
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 98304,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/720p/720p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "1280x",
              "ScaleType": "fit"
            }
          }
        },
        {
          "Audio": {
            "TranscodeAudio": {
              "Bitrate": 65536,
              "Codec": "aac",
              "SampleRate": 44100
            }
          },
          "Duration": 10,
          "InitialSegments": [
            2,
            2,
            2
          ],
          "InitialTranscode": 36,
          "URI": "oss://your-oss-bucket-name/output/540p/540p",
          "Video": {
            "TranscodeVideo": {
              "CRF": 26,
              "Codec": "h264",
              "FrameRate": 25,
              "Resolution": "720x",
              "ScaleType": "fit"
            }
          }
        }
      ]
    }
    
  • Exemple de réponse

    {
      "Duration": 60.085,
      "MasterURI": "oss://your-oss-bucket-name/output/master.m3u8",
      "RequestId": "********-3ADC-576A-BD1E-************",
      "Token": "1deb790e****************231a6f9d",
      "VideoPlaylist": [
        {
          "FrameRate": "25",
          "Resolution": "720x406",
          "Token": "8bcd9bc0****************67a65f48",
          "URI": "oss://your-oss-bucket-name/output/540p/540p.m3u8"
        },
        {
          "FrameRate": "25",
          "Resolution": "1280x720",
          "Token": "89ca4337****************cd031957",
          "URI": "oss://your-oss-bucket-name/output/720p/720p.m3u8"
        },
        {
          "FrameRate": "25",
          "Resolution": "1920x1080",
          "Token": "11fb1afb****************4f3683fc",
          "URI": "oss://your-oss-bucket-name/output/1080p/1080p.m3u8"
        }
      ]
    }
  • Exemple de code

    # -*- coding: utf-8 -*-
    import json
    from alibabacloud_imm20200930 import models as imm_20200930_models
    from alibabacloud_imm20200930.client import Client as imm20200930Client
    from alibabacloud_tea_openapi import models as open_api_models
    class Sample:
        def __init__(self):
            pass
        @staticmethod
        def create_client(
                access_key_id: str,
                access_key_secret: str,
        ) -> imm20200930Client:
            """
            Initialize a client using AccessKey ID and AccessKey secret.
            @param access_key_id:
            @param access_key_secret:
            @return: Client
            @throws Exception
            """
            config = open_api_models.Config(
                # Your AccessKey ID.
                access_key_id=access_key_id,
                # Your AccessKey secret.
                access_key_secret=access_key_secret
            )
            # IMM endpoint.
            config.endpoint = f'imm.cn-hangzhou.aliyuncs.com'
            return imm20200930Client(config)
        @staticmethod
        def main() -> None:
            # Use IMM AccessKey ID and secret. Read from configuration if possible.
            imm_access_key_id = "yourAccessKeyId"
            imm_access_key_secret = "yourAccessKeySecret"
            # Project name.
            project_name = "test-project"
            # Source video OSS URI.
            source_uri = "oss://your-oss-bucket-name/test.avi"
            # Target URI prefix.
            target_uri_prefix = "oss://your-oss-bucket-name/output"
            master_uri = f"{target_uri_prefix}/master.m3u8"
            target_1080p_uri = f"{target_uri_prefix}/1080p/1080p"
            target_720p_uri = f"{target_uri_prefix}/720p/720p"
            target_540p_uri = f"{target_uri_prefix}/540p/540p"
            # Initialize client.
            client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
            # Create 1080p target.
            target_1080p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=131072,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_1080p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="1920x",
                        scale_type="fit",
                    )
                ),
            )
            # Create 720p target.
            target_720p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=98304,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_720p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="1280x",
                        scale_type="fit",
                    )
                ),
            )
            # Create 540p target.
            target_540p = imm_20200930_models.GenerateVideoPlaylistRequestTargets(
                audio=imm_20200930_models.TargetAudio(
                    transcode_audio=imm_20200930_models.TargetAudioTranscodeAudio(
                        codec="aac",
                        bitrate=65536,
                        sample_rate=44100,
                    )
                ),
                duration=10,
                initial_segments=[2, 2, 2],
                initial_transcode=36,
                uri=target_540p_uri,
                video=imm_20200930_models.TargetVideo(
                    transcode_video=imm_20200930_models.TargetVideoTranscodeVideo(
                        codec="h264",
                        crf=26,
                        frame_rate=25,
                        resolution="720x",
                        scale_type="fit",
                    )
                ),
            )
            # Create API request.
            req = imm_20200930_models.GenerateVideoPlaylistRequest(
                project_name=project_name,
                source_uri=source_uri,
                master_uri=master_uri,
                targets=[target_1080p, target_720p, target_540p]
            )
            # Print request.
            print(json.dumps(req.to_map(), indent=4))
            # Send request.
            response = client.generate_video_playlist(req)
            # Print response.
            print(json.dumps(response.body.to_map(), indent=4))
    if __name__ == '__main__':
        Sample.main()
    
    package main
    import (
    	"fmt"
    	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
    	imm "github.com/alibabacloud-go/imm-20200930/v2/client"
    	"github.com/alibabacloud-go/tea/tea"
    )
    func main() {
    	// Initialize IMM client.
    	immClient, err := imm.NewClient(&openapi.Config{
    		RegionId:        tea.String("cn-hangzhou"),            // Region ID of your project.
    		AccessKeyId:     tea.String("your_access_key_id"),     // RAM user AccessKey ID.
    		AccessKeySecret: tea.String("your_access_key_secret"), // RAM user AccessKey secret.
    	})
    	if err != nil {
    		// Handle error.
    		panic(err)
    	}
    	// Project name.
    	projectName := "test-project"
    	// Video OSS URI.
    	sourceUri := "oss://your-oss-bucket-name/test.avi"
    	// Target URI prefix.
    	targetURIPrefix := "oss://your-oss-bucket-name/output"
    	masterURI := targetURIPrefix + "/master.m3u8"
    	target1080pURI := targetURIPrefix + "/1080p/1080p"
    	target720pURI := targetURIPrefix + "/720p/720p"
    	target540pURI := targetURIPrefix + "/540p/540p"
    	target1080p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(131072),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target1080pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1920x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	target720p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(98304),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target720pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("1280x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	target540p := &imm.GenerateVideoPlaylistRequestTargets{
    		Audio: &imm.TargetAudio{
    			TranscodeAudio: &imm.TargetAudioTranscodeAudio{
    				Bitrate:    tea.Int32(65536),
    				Codec:      tea.String("aac"),
    				SampleRate: tea.Int32(44100),
    			},
    		},
    		Duration:         tea.Float32(10),
    		InitialSegments:  []*float32{tea.Float32(2), tea.Float32(2), tea.Float32(2)},
    		InitialTranscode: tea.Float32(36),
    		URI:              tea.String(target540pURI),
    		Video: &imm.TargetVideo{
    			TranscodeVideo: &imm.TargetVideoTranscodeVideo{
    				Codec:      tea.String("h264"),
    				CRF:        tea.Float32(26),
    				FrameRate:  tea.Float32(25),
    				Resolution: tea.String("720x"),
    				ScaleType:  tea.String("fit"),
    			},
    		},
    	}
    	// Create API request.
    	req := &imm.GenerateVideoPlaylistRequest{
    		ProjectName: tea.String(projectName),
    		SourceURI:   tea.String(sourceUri),
    		MasterURI:   tea.String(masterURI),
    		Targets:     []*imm.GenerateVideoPlaylistRequestTargets{target1080p, target720p, target540p},
    	}
    	// Send request.
    	res, err := immClient.GenerateVideoPlaylist(req)
    	if err != nil {
    		panic(err)
    	}
    	// Print response.
    	fmt.Println("Response:", *res.Body)
    }
    

Étape 2 : Signer la liste de lecture

Signez l'URL de la liste de lecture principale renvoyée à l'aide de la signature OSS. Consultez la section Étape 2 : Signer la liste de lecture.

Étape 3 : Lire la vidéo

Pour les instructions de lecture, consultez la section Étape 3 : Lire la vidéo.

FAQ

Ai-je besoin d'un lecteur personnalisé ?

Non. Le transcodage à la volée prend en charge le protocole HLS standard. Utilisez n'importe quel lecteur compatible HLS standard (tel que le Alibaba Cloud Aliplayer ou le navigateur Safari).

Quels fichiers de sortie sont générés ?

Nous générons un fichier m3u8 et des fichiers TS en fonction du préfixe de chemin d'entrée que vous spécifiez. Le fichier m3u8 est généré immédiatement.

Si vous spécifiez une durée de pré-transcodage, le système génère de manière asynchrone les fichiers TS correspondants. Les segments non spécifiés sont transcodés à la demande pendant la lecture. Si une vidéo n'est jamais lue, aucun fichier TS n'est généré pour ces segments. Par exemple, si la lecture commence à la 15e minute, le transcodage débute à partir de ce point. La structure de répertoire résultante ressemble à ceci :

.
├── outobjprefix.m3u8
├── outobjprefix-c280f054328fcde47c1732a8f2915009-0.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-1.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-2.ts
├── outobjprefix-c280f054328fcde47c1732a8f2915009-3.ts

Puis-je toujours lire la vidéo si je supprime manuellement les fichiers ts générés ?

Oui. Tant que la vidéo source et la liste de lecture m3u8 restent intactes, la suppression de certains ou de tous les fichiers ts n'affecte pas la lecture. Lorsque la liste de lecture m3u8 est à nouveau demandée, les fichiers ts manquants sont régénérés. Cela vous permet de nettoyer les fichiers ts des vidéos rarement consultées pour réduire les coûts de stockage sans impacter la lecture future.

Puis-je utiliser un fichier m3u8 non issu du transcodage à la volée pour cette fonctionnalité ?

Non. Vous ne pouvez pas utiliser des fichiers m3u8 générés en dehors du processus de transcodage à la volée pour activer cette fonctionnalité.

Puis-je utiliser CDN pour accélérer le transcodage à la volée ?

Oui. Pour plus de détails, consultez la section Utilisation de CDN pour accélérer le transcodage à la volée.