Créez un flux en direct 24h/24 et 7j/7 à partir de vos fichiers vidéo à la demande (VOD) en utilisant les API. Combinez plusieurs fichiers VOD en un flux continu, planifiez des diffusions et insérez des publicités en temps réel ou à intervalles programmés pour générer des revenus.
Fonctionnement
Pour créer un flux VOD-to-live, appelez les API d'un studio de production en mode playlist. Le processus comporte quatre étapes :
Activez le bucket système VOD : après avoir activé ApsaraVideo VOD, le système attribue un bucket système VOD indépendant dans chaque région de service. Activez ce bucket pour télécharger et gérer vos ressources multimédias.
Téléchargez les fichiers audio et vidéo : téléchargez vers le stockage ApsaraVideo VOD les fichiers vidéo que vous souhaitez diffuser. Par exemple, téléchargez les vidéos A, B et C dans leur ordre de lecture.
Ajoutez un domaine de streaming : ce domaine fournit l'URL de lecture à votre audience.
Utilisez les API pour configurer le studio de production : appelez les API pour spécifier le nombre de lectures de chaque vidéo et le nombre de boucles de la liste complète des épisodes. Par exemple, configurez la vidéo A pour qu'elle soit lue une fois, la vidéo B deux fois et la vidéo C trois fois. Ensuite, récupérez la liste des épisodes et démarrez le flux.
Prérequis
Vous avez créé un compte Alibaba Cloud et effectué la vérification d'identité réelle.
-
Les services ApsaraVideo VOD, ApsaraVideo Live et Cloud Production Studio sont activés. Pour plus d'informations, consultez Activer ApsaraVideo VOD, Activer et acheter ApsaraVideo Live et Activer le service Cloud Production Studio.
RemarqueLa fonctionnalité de studio de production est actuellement disponible dans les régions Chine (Shanghai), Chine (Pékin), Asie-Pacifique SE 1 (Singapour) et Asie-Pacifique SE 3 (Jakarta). La prise en charge d'autres régions sera disponible à l'avenir.
Vous disposez d'un domaine de streaming. Pour démarrer rapidement, nous vous recommandons de sélectionner un centre de diffusion situé hors de la Chine continentale et de définir la région d'accélération sur Outside Chinese Mainland. Cela exempte le domaine des exigences de dépôt ICP.
Les stratégies système AliyunFCFullAccess, AliyunLiveFullAccess et AliyunVODFullAccess sont attachées à un utilisateur RAM. Pour plus d'informations, consultez Créer un utilisateur RAM et accorder des autorisations.
Étape 1. Activer le bucket système VOD
Dans la console ApsaraVideo VOD, choisissez Configuration Management > Media Management > Storage. Pour le bucket système VOD, cliquez sur Enable.
Attendez que l'adresse de stockage soit activée. Vous ne pouvez utiliser l'adresse de stockage qu'une fois que le système affiche le message The dedicated bucket is enabled. et que le statut de l'adresse de stockage est Normal.
Étape 2. Télécharger les fichiers audio et vidéo
Dans la console ApsaraVideo VOD, accédez à la page et cliquez sur Upload Audio/Video .
Sur la page Upload Audio/Video , cliquez sur .
Dans la boîte de dialogue , sélectionnez , choisissez les trois fichiers vidéo préparés dans l'ordre, puis cliquez sur Upload.
Une fois le téléchargement terminé, revenez à la page Audio/Video pour afficher et enregistrer l'ID de ressource de chaque fichier. Dans la colonne Actions de chaque vidéo, cliquez sur More > Add to Production Studio. Cela rend le contenu disponible pour le studio de production ApsaraVideo Live. Pour plus d'informations sur les fonctionnalités d'un studio de production, consultez Présentation des fonctionnalités.
Étape 3. Ajouter un domaine de streaming
Dans la console ApsaraVideo Live, accédez à la page Domain Names et cliquez sur Add Domain.
-
Configurez les détails du domaine et cliquez sur Next. Pour plus d'informations sur les paramètres, consultez Ajouter un nom de domaine accéléré.
Pour ce tutoriel, définissez Business Type sur Streaming Domain, Acceleration Region sur Outside Chinese Mainland, saisissez votre Accelerated Domain Name et définissez Live Center sur China (Shanghai).
-
Enregistrez la valeur CNAME générée pour l'étape suivante.
Vous devez également ajouter un enregistrement CNAME auprès de votre fournisseur DNS pour pointer l'host record vers la valeur CNAME. Cela permet l'accélération CDN.
Sur la page Alibaba Cloud DNS, recherchez le domaine que vous souhaitez configurer et cliquez sur Settings dans la colonne Actions.
-
Cliquez sur Add Record, complétez la configuration CNAME et cliquez sur Confirm. Pour plus d'informations, consultez Configurer un enregistrement CNAME pour un nom de domaine.
Définissez Record Type sur CNAME, Host sur @ et Resolution Line sur Default. Dans le champ Record Value, saisissez l'adresse cible CNAME. Définissez TTL sur 10 Minutes.
Étape 4. Configurer le studio de production avec les API
-
Ouvrez IntelliJ IDEA et créez un projet Maven. Dans le fichier pom.xml, créez une balise <dependencies></dependencies> et ajoutez les dépendances suivantes.
<dependency> <groupId>com.aliyun</groupId> <artifactId>live20161101</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> Dans le répertoire
src/main/javade votre projet, faites un clic droit sur le dossierjavaet créez une nouvelle classe Java. Pour cet exemple, nommez-laBodan.-
Configurez les paramètres dans l'exemple de code suivant et exécutez-le.
package com.alibaba.aliyundebug.common; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyun.live20161101.Client; import com.aliyun.live20161101.models.*; import com.aliyun.teaopenapi.models.Config; import org.apache.commons.codec.digest.DigestUtils; import java.util.List; import java.util.Random; import java.util.UUID; public class Bodan { private final static String ACCESS_KEY_ID = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); private final static String ACCESS_KEY_SECRET = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); private static class LiveClient { private static volatile Client instance; private LiveClient() { } public static Client getInstance(String endpoint, String accessKeyId, String accessKeySecret) { if (instance == null) { synchronized (LiveClient.class) { if (instance == null) { try { Config config = new Config(); config.setEndpoint(endpoint); config.setAccessKeyId(accessKeyId); config.setAccessKeySecret(accessKeySecret); instance = new Client(config); } catch (Exception e) { throw new RuntimeException("Live client initialization failed: " + e.getMessage(), e); } } } } return instance; } } private static CreateCasterResponse createCaster(Client client) throws Exception { CreateCasterRequest request = new CreateCasterRequest(); Random random = new Random(); int i = random.nextInt(100000); request.setCasterName("casterName" + i); UUID uuid = UUID.randomUUID(); String token = "thisIsaToken"; String clientToken = DigestUtils.sha256Hex(token + uuid); request.setClientToken(clientToken); // To use an episode list, the production studio must be in playlist mode. request.setNormType(6); request.setChargeType("PostPaid"); CreateCasterResponse response = client.createCaster(request); System.out.println("The production studio is created. Response: " + JSON.toJSONString(response)); return response; } private static void setCasterConfig(Client client, String casterId,String domainName) throws Exception { SetCasterConfigRequest request = new SetCasterConfigRequest(); request.setCasterId(casterId); // Configure the domain name. request.setDomainName(domainName); JSONObject transcodeConfig = new JSONObject(); JSONArray liveTemplate = new JSONArray(); // Configure a template for the production studio. liveTemplate.add("lld"); transcodeConfig.put("LiveTemplate", liveTemplate); // Configure a transcoding template. transcodeConfig.put("CasterTemplate", "lp_sd"); request.setTranscodeConfig(transcodeConfig.toJSONString()); SetCasterConfigResponse response = client.setCasterConfig(request); System.out.println("The production studio is configured. Response: " + JSON.toJSONString(response)); } private static StartCasterResponse startCaster(Client client, String casterId) throws Exception { StartCasterRequest startCasterRequest = new StartCasterRequest(); startCasterRequest.setCasterId(casterId); StartCasterResponse acsResponse = client.startCaster(startCasterRequest); System.out.println("The production studio is started."); return acsResponse; } private static StopCasterResponse stopCaster(Client client, String casterId) throws Exception { StopCasterRequest stopCasterRequest = new StopCasterRequest(); stopCasterRequest.setCasterId(casterId); StopCasterResponse acsResponse = client.stopCaster(stopCasterRequest); System.out.println("The production studio is stopped."); return acsResponse; } private static AddShowIntoShowListResponse addShowIntoShowList(Client client, String showName, String resourceId, String resourceUrl, String resourceType, Integer spot, Integer repeatTimes, String casterId, Long duration) throws Exception { AddShowIntoShowListRequest addShowIntoShowListRequest = new AddShowIntoShowListRequest(); if (casterId == null || resourceType == null) { return null; } if (resourceId == null && resourceUrl == null) { return null; } addShowIntoShowListRequest.setCasterId(casterId); addShowIntoShowListRequest.setResourceType(resourceType); if (showName != null) { addShowIntoShowListRequest.setShowName(showName); } if (resourceUrl != null) { addShowIntoShowListRequest.setResourceUrl(resourceUrl); } if (resourceId != null) { addShowIntoShowListRequest.setResourceId(resourceId); } if (spot != null) { addShowIntoShowListRequest.setSpot(spot); } if (repeatTimes != null) { addShowIntoShowListRequest.setRepeatTimes(repeatTimes); } if (duration != null) { addShowIntoShowListRequest.setDuration(duration); } return client.addShowIntoShowList(addShowIntoShowListRequest); } private static void removeShowFromShowList(Client client, String casterId, String showId) throws Exception { RemoveShowFromShowListRequest removeShowFromShowList = new RemoveShowFromShowListRequest(); removeShowFromShowList.setShowId(showId); removeShowFromShowList.setCasterId(casterId); RemoveShowFromShowListResponse removeShowFromShowListFromShowListResponse = client.removeShowFromShowList(removeShowFromShowList); System.out.println("The show is removed from the production studio. Response: " + JSON.toJSONString(removeShowFromShowListFromShowListResponse)); } private static void modifyShowList(Client client, String casterId, String showId, Integer repeatTimes, Integer spot, String highPriorityShowId, String highPriorityShowStartTime) throws Exception { ModifyShowListRequest modifyShowListRequest = new ModifyShowListRequest(); if (casterId != null) { modifyShowListRequest.setCasterId(casterId); } if (showId != null) { modifyShowListRequest.setShowId(showId); } if (repeatTimes != null) { modifyShowListRequest.setRepeatTimes(repeatTimes); } if (spot != null) { modifyShowListRequest.setSpot(spot); } if (highPriorityShowId != null) { modifyShowListRequest.setHighPriorityShowId(highPriorityShowId); } if (highPriorityShowStartTime != null) { modifyShowListRequest.setHighPriorityShowStartTime(highPriorityShowStartTime); } ModifyShowListResponse modifyShowListResponse = client.modifyShowList(modifyShowListRequest); System.out.println("The episode list is modified. Response: " + JSON.toJSONString(modifyShowListResponse)); } private static void describeShowList(Client client, String casterId) throws Exception { DescribeShowListRequest describeShowListRequest = new DescribeShowListRequest(); if (casterId != null) { describeShowListRequest.setCasterId(casterId); } DescribeShowListResponse describeShowListRequestResponse = client.describeShowList(describeShowListRequest); System.out.println("The query for the episode list is successful. Response: " + JSON.toJSONString(describeShowListRequestResponse)); DescribeShowListResponseBody showListBody = describeShowListRequestResponse.getBody(); JSONObject showList = JSON.parseObject(showListBody.getShowList()); JSONArray shows = showList.getJSONArray("Shows"); // Print the episode list. for (int i = 0; i < shows.size(); i++) { JSONObject show = (JSONObject) shows.get(i); String showId = show.getString("ShowId"); String resourceType = show.getString("ResourceType"); String resourceInfo = show.getString("ResourceInfo"); Integer repeatTimes = show.getInteger("RepeatTimes"); Long duration = show.getLong("Duration"); String showInfo = String.format("show%d: showId: %s \n resourceType: %s \n resourceInfo: %s \n RepeatTimes: %d \n Duration: %d", i + 1, showId, resourceType, resourceInfo, repeatTimes, duration); System.out.println(showInfo); } } private static void playChoosenShow(Client client, String casterId, String showId) throws Exception { PlayChoosenShowRequest playChoosenShow = new PlayChoosenShowRequest(); playChoosenShow.setCasterId(casterId); playChoosenShow.setShowId(showId); PlayChoosenShowResponse playChoosenShowResponse = client.playChoosenShow(playChoosenShow); System.out.println("Successfully switched to showId: " + showId); } private static List<DescribeCasterStreamUrlResponseBody.DescribeCasterStreamUrlResponseBodyCasterStreamsCasterStream> describeCasterStreamUrl(Client client, String casterId) throws Exception { DescribeCasterStreamUrlRequest describeCasterStreamUrlRequest = new DescribeCasterStreamUrlRequest(); describeCasterStreamUrlRequest.setCasterId(casterId); DescribeCasterStreamUrlResponse response = client.describeCasterStreamUrl(describeCasterStreamUrlRequest); return response.getBody().getCasterStreams().getCasterStream(); } public static void main(String[] args) throws Exception { Client client = LiveClient.getInstance("live.aliyuncs.com", ACCESS_KEY_ID, ACCESS_KEY_SECRET); // Create a production studio. CreateCasterResponse caster = createCaster(client); String casterId = caster.getBody().getCasterId(); // Configure the production studio. String domainName = "example.aliyundoc.com"; // Set the domain name. setCasterConfig(client, casterId,domainName); // Add three VOD files. The first file plays once, the second twice, and the third three times. String[] resourceIds = new String[]{"698d2b23581f476ea71107703e64****", "9c97e83e211a435b9f797e4e20ee****", "76c6addaa41c438985666a8a964f****"}; for (int i = 0; i < resourceIds.length; i++) { String showName = "ShowName#" + i; Integer repeatTimes = i; addShowIntoShowList(client, showName, resourceIds[i], null, "vod", null, repeatTimes, casterId, null); } modifyShowList(client, casterId, null, 10, null, null, null); describeShowList(client, casterId); startCaster(client, casterId); Thread.sleep(500000); stopCaster(client, casterId); } }Descriptions des paramètres :
Paramètre
Description
private final static String ACCESS_KEY_ID = "Your AccessKey ID"; private final static String ACCESS_KEY_SECRET = "Your AccessKey secret";Une paire AccessKey est utilisée pour la vérification d'identité. Elle se compose d'un AccessKey ID et d'un AccessKey secret.
-
AccessKey ID : identifie l'utilisateur.
-
AccessKey secret : authentifie l'utilisateur. Gardez votre AccessKey secret confidentiel.
Pour plus d'informations, consultez Créer une paire AccessKey.
request.setDomainName("example.aliyundoc.com");Le domaine de streaming.
String[] resourceIds = new String[]{"698d2b23581f476ea71107703e64****", "9c97e83e211a435b9f797e4e20ee****", "76c6addaa41c438985666a8a964f****"};Les ID de ressource. Consultez l'Étape 2. Télécharger les fichiers audio et vidéo pour les obtenir.
-
-
Consultez le résultat de l'exécution.
Exemple de résultat :
"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" ... The production studio is created. Response: {"casterId":"87564f62-8c51-4xxx","requestId":"853D754D-440A-5743-xxx"} The production studio is configured. Response:{"casterId":"87564f62-8c3xxx","requestId":"4727BCE9-2058-5xxx"} The episode list is modified. Response: {"data":"{\"RequestId\":\"1B2E6CCF-7726-5xxx\",xxx}","httpResponse":{"encoding":"UTF-8","headers":{"Keep-Alive":"timeout=25","Access-Control-xxx"}}} The query for the episode list is successful. Response: {"data":"{\"RequestId\":\"CCE3BF90-E6A5-xxx\",\"ShowListInfo\":{\"TotalShowListRepeatTimes\":10,\"ShowListRepeatTimes\":10,\"ShowList\":xxx}}"} show1: showId: 69548057-i7z xxx resourceType: null resourceInfo: {"resourceId":"908xxx","resourceUrl":"https://outin-f7/07xxx-xxx-22ef7"} RepeatTimes: 0 Sur la page Production Studios, recherchez le studio de production que vous avez créé et cliquez sur Open dans la colonne Actions. Vous pouvez voir les trois fichiers VOD ajoutés à la liste des épisodes, lus séquentiellement comme configuré.
Étapes suivantes
Pour lire le flux, cliquez sur Streaming URL dans le studio de production et copiez l'URL. Utilisez un lecteur multimédia tel que VLC, une démo de streaming en direct ou un SDK de lecteur pour la lecture. Pour plus d'informations, consultez Lecture de flux en direct.
La boîte de dialogue Streaming URL fournit des URL regroupées par résolution, telles que Original et lld. Chaque groupe inclut des URL de lecture pour les protocoles FLV, RTMP, M3U8 et RTS. Copiez l'URL du protocole que vous souhaitez utiliser.