L'encapsulation de flux en direct convertit vos flux en différents formats de conteneur pour une lecture via divers protocoles de streaming à faible latence.
Formats de conteneur pris en charge
ApsaraVideo Live prend en charge les protocoles Real-Time Messaging Protocol (RTMP), HTTP-FLV et HTTP Live Streaming (HLS). Pour réduire la latence et améliorer la compatibilité, l'encapsulation de flux en direct convertit les flux en différents formats de conteneur dans le cloud avant leur diffusion.
Le tableau suivant décrit les formats de conteneur pris en charge :
|
Format de conteneur |
Protocole de streaming pris en charge |
Codec pris en charge |
|
TS |
Low-Latency HLS (LL-HLS) |
Audio : AAC, OPUS, AC3, EAC3, MP3 Vidéo : H.264, H.265 |
|
CMAF |
LL-HLS, HLS, DASH |
Audio : AAC Vidéo : H.264, H.265 |
Fonctionnement
L'encapsulation de flux en direct divise les flux en segments au format TS ou CMAF. Le système diffuse ensuite ces segments via les protocoles HLS, LL-HLS ou DASH. Pour chaque flux, le système génère un fichier manifeste qui répertorie les URL des segments dans l'ordre. Lorsqu'un client demande le flux en direct, le serveur renvoie le dernier manifeste.
Vous pouvez combiner cette fonctionnalité avec le transcodage de flux en direct et le décalage temporel pour améliorer l'expérience de streaming.
Avantages
-
Diffusion de flux en direct à faible latence
Par rapport au HLS standard, le LL-HLS divise les flux en segments partiels plus petits (de 200 ms à 1 seconde). Cette approche évite les rechargements de liste de lecture et réduit la latence de bout en bout à 3 à 5 secondes.
-
Compatibilité améliorée avec plusieurs appareils
Par défaut, ApsaraVideo Live diffuse les flux en direct via HLS en utilisant le format de conteneur TS. Ce format n'est pas compatible avec certains appareils et navigateurs. Utilisez l'encapsulation pour empaqueter le contenu au format CMAF, qui prend en charge une plus large gamme d'appareils, de plateformes et de codecs (y compris H.265).
-
Opération non intrusive pour vos flux existants
L'activation de l'encapsulation de flux en direct est une opération non intrusive. Elle génère uniquement un flux de lecture encapsulé supplémentaire basé sur le flux ingéré d'origine. Vos flux RTMP, HTTP-FLV et HLS existants continuent de fonctionner comme auparavant, et vos configurations d'enregistrement ne sont pas affectées. Après avoir activé l'encapsulation, de nouvelles URL de streaming aux formats CMAF et Low-Latency HLS (LL-HLS) deviennent disponibles.
Limitations
Taille du GOP
La taille du GOP du flux ingéré doit rester cohérente. Si vous encapsulez un flux transcodé, assurez-vous que sa taille de GOP est également stable.
La durée de chaque segment doit être un multiple de la taille du GOP.
Protocole LL-HLS
Les saccades peuvent augmenter en cas de mauvaises conditions réseau. Nous recommandons d'utiliser l'encapsulation avec le transcodage multi-débit, qui ajuste automatiquement le débit binaire.
Définissez la taille du GOP sur 1 ou 2 secondes pour éviter les saccades ou les échecs de lecture.
Un domaine de streaming principal peut prendre en charge jusqu'à 100 000 spectateurs. Pour augmenter ce quota, soumettez un ticket.
Propagation de la configuration
Lorsque vous ajoutez une configuration d'encapsulation pour la première fois, le système met à jour les paramètres de diffusion de contenu. Ces modifications prennent effet après 3 à 5 minutes.
Créer une configuration d'encapsulation
Créez une configuration d'encapsulation dans la console ou en appelant une opération API.
Pour un flux en cours, la configuration ne prend effet qu'après la réingestion du flux.
Console
Connectez-vous à la console ApsaraVideo Live.
Dans le volet de navigation de gauche, choisissez Feature Management > Encapsulation.
Sélectionnez un domaine de streaming, puis cliquez sur Add.
-
Dans la boîte de dialogue Encapsulation Settings, configurez les paramètres suivants :
Paramètre
Description
AppName
Saisissez un astérisque (
*) pour appliquer à toutes les applications. Pour cibler une application spécifique, saisissez leAppNamede l'URL d'ingestion. La valeur ne doit pas dépasser 255 caractères.StreamName
Saisissez un astérisque (
*) pour appliquer à tous les flux. Pour cibler un flux spécifique, saisissez le nom du flux. La valeur ne doit pas dépasser 255 caractères.Protocol
Sélectionnez le format de conteneur et le protocole de lecture : Valeurs valides :
HLS - CMAF
LL-HLS - CMAF
LL-HLS - TS
DASH - CMAF
HLS & DASH - CMAF
Segment Quantity
Spécifiez le nombre de segments par fichier manifeste. Valeurs valides : 3 à 5.
Segment Length (s)
Pour HLS ou DASH : Saisissez un entier compris entre 1 et 10. Définissez cette valeur comme un multiple de la taille de votre GOP (GOP recommandé : 5 s).
Pour LL-HLS : Saisissez 1 ou 2. Définissez cette valeur comme un multiple de la taille de votre GOP (GOP recommandé : 1 s).
Part Length (ms)
(LL-HLS uniquement) Spécifiez la durée des segments partiels. Valeurs valides : 200 à 1 000. Nous recommandons une valeur légèrement supérieure à un tiers de la longueur du segment.
Transcoded Stream
Spécifiez s'il faut encapsuler les flux transcodés. Valeurs valides :
Source Stream Only
Transcoded Stream Included
RemarqueSi votre domaine de streaming utilise un centre de diffusion en direct situé hors de Chine continentale (Singapour, Allemagne, Japon ou Indonésie), le délai de lecture peut augmenter. Testez votre configuration avant de l'utiliser en production.
Cliquez sur OK.
API
Appelez l'opération API AddLivePackageConfig pour ajouter une configuration d'encapsulation.
Remplacez les espaces réservés, y compris <Your RegionId>, <Your DomainName>, <Your AppName> et <Your StreamName>.
Pour connaître les valeurs de protocole valides, consultez AddLivePackageConfig.
Exemple de code
// This file is auto-generated, don't edit it. Thanks.
package demo;
import com.aliyun.auth.credentials.Credential;
import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
import com.aliyun.core.http.HttpClient;
import com.aliyun.core.http.HttpMethod;
import com.aliyun.core.http.ProxyOptions;
import com.aliyun.httpcomponent.httpclient.ApacheAsyncHttpClientBuilder;
import com.aliyun.sdk.service.live20161101.models.*;
import com.aliyun.sdk.service.live20161101.*;
import com.google.gson.Gson;
import darabonba.core.RequestConfiguration;
import darabonba.core.client.ClientOverrideConfiguration;
import darabonba.core.utils.CommonUtil;
import darabonba.core.TeaPair;
//import javax.net.ssl.KeyManager;
//import javax.net.ssl.X509TrustManager;
import java.net.InetSocketAddress;
import java.time.Duration;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.io.*;
public class AddLivePackageConfig {
public static void main(String[] args) throws Exception {
// HttpClient Configuration
/*HttpClient httpClient = new ApacheAsyncHttpClientBuilder()
.connectionTimeout(Duration.ofSeconds(10)) // Set the connection timeout time, the default is 10 seconds
.responseTimeout(Duration.ofSeconds(10)) // Set the response timeout time, the default is 20 seconds
.maxConnections(128) // Set the connection pool size
.maxIdleTimeOut(Duration.ofSeconds(50)) // Set the connection pool timeout, the default is 30 seconds
// Configure the proxy
.proxy(new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("<YOUR-PROXY-HOSTNAME>", 9001))
.setCredentials("<YOUR-PROXY-USERNAME>", "<YOUR-PROXY-PASSWORD>"))
// If it is an https connection, you need to configure the certificate, or ignore the certificate(.ignoreSSL(true))
.x509TrustManagers(new X509TrustManager[]{})
.keyManagers(new KeyManager[]{})
.ignoreSSL(false)
.build();*/
// Configure Credentials authentication information, including ak, secret, token
StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
// Please ensure that the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
.accessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
.accessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//.securityToken(System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")) // use STS token
.build());
// Configure the Client
AsyncClient client = AsyncClient.builder()
.region("<Your RegionId>") // Region ID
//.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
.credentialsProvider(provider)
//.serviceConfiguration(Configuration.create()) // Service-level configuration
// Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
.overrideConfiguration(
ClientOverrideConfiguration.create()
// For endpoints, refer to https://api.alibabacloud.com/product/live
.setEndpointOverride("live.aliyuncs.com")
//.setConnectTimeout(Duration.ofSeconds(30))
)
.build();
// Parameter settings for API request
AddLivePackageConfigRequest addLivePackageConfigRequest = AddLivePackageConfigRequest.builder()
.regionId("<Your RegionId>")
.domainName("<Your DomainName>")
.appName("<Your AppName>")
.streamName("<Your StreamName>")
.setProtocol("<Protocol>");
// Request-level configuration rewrite, can set Http request parameters, etc.
// .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
.build();
// Asynchronously get the return value of the API request
CompletableFuture<AddLivePackageConfigResponse> response = client.addLivePackageConfig(addLivePackageConfigRequest);
// Synchronously get the return value of the API request
AddLivePackageConfigResponse resp = response.get();
System.out.println(new Gson().toJson(resp));
// Asynchronous processing of return values
/*response.thenAccept(resp -> {
System.out.println(new Gson().toJson(resp));
}).exceptionally(throwable -> { // Handling exceptions
System.out.println(throwable.getMessage());
return null;
});*/
// Finally, close the client
client.close();
}
}
Pour obtenir des instructions sur la configuration du SDK, consultez Utiliser le SDK Java.
Après la configuration, l'URL de streaming de qualité d'origine reste accessible.
Ingérer et lire un flux encapsulé
Ingérer un flux
Pour une lecture fluide, maintenez une taille de GOP cohérente pour votre flux ingéré.
Utilisez Open Broadcaster Software (OBS) avec les paramètres recommandés suivants :

Lire un flux encapsulé
-
Obtenez l'URL de streaming. Le format varie selon le protocole :
Protocole
Format d'URL
HLS
http://<DomainName>/<AppName>/<StreamName>.m3u8?aliyunols=on&auth_key=<AuthKey>DASH
http://<DomainName>/<AppName>/<StreamName>.mpd?aliyunols=on&auth_key=<AuthKey>LL-HLS
http://<DomainName>/<AppName>/<StreamName>-llhls.m3u8?aliyunols=on&auth_key=<AuthKey>ImportantLe paramètre
aliyunols=onest requis pour les URL de flux encapsulés.Vous pouvez utiliser le générateur d'URL pour générer des URL de streaming. Le format de l'URL dépend de votre configuration :
Format de conteneur
Protocole
Types d'URL générés
TS
LL-HLS
LL-HLS et HLS
CMAF
LL-HLS
LL-HLS et HLS
CMAF
HLS
HLS
CMAF
DASH
DASH
CMAF
HLS & DASH
HLS et DASH
-
Lisez le flux avec un lecteur compatible. Nous recommandons ApsaraVideo Player.
Pour utiliser la démo web d'ApsaraVideo Player :

a. Définissez Video Type sur Broadcast.
b. Saisissez l'URL de streaming.
c. Cliquez sur l'onglet Preview pour prévisualiser la vidéo.
ImportantPour utiliser la version web d'ApsaraVideo Player, vous devez configurer des certificats HTTPS et définir l'en-tête
Access-Control-Allow-Originpour l'accès inter-domaines. Pour plus de détails, consultez Paramètres HTTPS et Configurer les en-têtes HTTP.
Utilisation avancée
Encapsuler des flux transcodés
Vous pouvez combiner l'encapsulation avec le transcodage pour empaqueter des flux transcodés.
Procédure
Configurez le transcodage pour votre flux source. Pour plus d'informations, consultez Cas d'utilisation.
-
Lors de la création d'une configuration d'encapsulation, définissez Transcoded Stream sur Transcoded Stream Included dans la console ou définissez
IgnoreTranscodesurfalsevia l'API AddLivePackageConfig :// Include transcoded streams in encapsulation process (default: true = exclude) addLivePackageConfigRequest.setIgnoreTranscode(false); -
Générez l'URL de streaming pour le flux transcodé encapsulé :
-
Modèle de transcodage par défaut ou personnalisé : Ajoutez
_<template-id>àStreamName. Exemple :http://<DomainName>/<AppName>/<StreamName>_<template-id>-llhls.m3u8?aliyunols=on&auth_key=<AuthKey> Modèle de transcodage multi-débit : Ajoutez
_<template-group-id>àStreamName.
RemarqueCombinez l'encapsulation avec le transcodage multi-débit pour activer la lecture adaptative, ce qui permet aux lecteurs de basculer automatiquement vers un débit binaire inférieur en cas de mauvaises conditions réseau.
Le comportement des URL de sortie diffère selon le type de modèle de transcodage utilisé :
Pour le transcodage multi-débit :
La configuration d'encapsulation remplace le format de sortie des flux transcodés. Par exemple, si vous spécifiez un format d'encapsulation
DASH - CMAF, le système générera uniquement des URL DASH - CMAF pour les flux multi-débit ; il ne générera pas d'URL HLS.Pour le transcodage par défaut ou personnalisé :
Les URL de flux transcodés d'origine ne sont pas affectées. Au lieu de cela, le système génère des URL encapsulées supplémentaires pour ces flux transcodés.
-
Lisez le flux avec un lecteur compatible.
Décalage temporel pour les flux encapsulés
Vous pouvez utiliser le décalage temporel avec des flux encapsulés. Pour plus d'informations, consultez le décalage temporel.
Lorsque le décalage temporel est activé, le format des segments décalés hérite de la longueur et du format des segments spécifiés dans votre configuration d'encapsulation.
HLS ou LL-HLS (CMAF) : Les segments décalés sont au format CMAF.
LL-HLS (TS) : Les segments décalés sont au format TS.