Tous les produits
Search
Centre de documentation

ApsaraVideo Live:Utiliser le SDK Push pour Flutter

Dernière mise à jour :Aug 19, 2026

Le SDK Push pour Flutter permet d'ajouter l'ingestion de flux aux applications Flutter. Ce guide présente le workflow de base et fournit des exemples d'utilisation pour chaque fonctionnalité.

Fonctionnalités

  • Prend en charge l'ingestion de flux via le protocole RTMP (Real-Time Messaging Protocol).

  • Prend en charge l'ingestion de flux via Alibaba Real-Time Communication (ARTC) basé sur le protocole UDP (User Datagram Protocol).

  • Utilise le codec H.264 pour l'encodage vidéo et AAC pour l'encodage audio.

  • Permet de configurer des paramètres personnalisés pour le contrôle du débit binaire, la résolution et le mode d'affichage.

  • Prend en charge diverses opérations liées à la caméra.

  • Propose des retouches en temps réel et des effets de retouche personnalisés.

  • Permet d'ajouter et de supprimer des autocollants animés sous forme de filigranes.

  • Accepte les entrées audio et vidéo externes dans différents formats, tels que YUV et PCM (pulse-code modulation).

  • Permet l'ingestion de flux audio uniquement, vidéo uniquement, ainsi que l'ingestion en arrière-plan.

  • Prend en charge la musique de fond.

  • Permet de capturer des instantanés vidéo.

  • Gère automatiquement la reconnexion et les erreurs.

  • Intègre les algorithmes AGC (Automatic Gain Control), ANR (Automatic Noise Reduction) et AEC (Acoustic Echo Cancellation).

  • Permet de basculer entre les modes d'encodage logiciel et matériel, améliorant ainsi la stabilité du module d'encodage.

Limitations

Notez les limitations suivantes :

  • Configurez l'orientation de l'écran avant l'ingestion du flux. Il est impossible de faire pivoter l'écran pendant la diffusion en direct.

  • Désactivez la rotation automatique de l'écran pour l'ingestion de flux en mode paysage.

  • En mode d'encodage matériel, la valeur de la résolution de sortie doit être un multiple de 16 pour assurer la compatibilité avec l'encodeur. Par exemple, si vous définissez la résolution sur 540p, la résolution de sortie sera de 544 × 960. Adaptez la taille de l'écran du lecteur en fonction de la résolution de sortie pour éviter l'apparition de bandes noires.

Référence API

Référence API du SDK Push pour Flutter

Procédure

  1. Enregistrer le SDK

  2. Configurer les paramètres d'ingestion de flux

  3. Démarrer l'ingestion de flux

Utilisation des fonctionnalités

Enregistrer le SDK

Avant l'enregistrement, configurez la licence du SDK. Le SDK Push pour Flutter prend en charge la licence unifiée. Pour demander et configurer une licence, consultez la rubrique Intégrer une licence Push SDK.

Enregistrez le SDK avant l'ingestion du flux.

  1. Enregistrez le SDK.

    AlivcLiveBase.registerSDK();
  2. Définissez un écouteur pour l'enregistrement.

    AlivcLiveBase.setListener(AlivcLiveBaseListener(
      onLicenceCheck: (AlivcLiveLicenseCheckResultCode result, String reason) {
        if (result == AlivcLiveLicenseCheckResultCode.success) {
          /// The SDK is registered.
        }
      },
    ));

Configurer les paramètres d'ingestion de flux

Tous les paramètres de base disposent de valeurs par défaut. Nous vous recommandons d'utiliser ces valeurs par défaut.

/// Create an AlivcLivePusher instance.
AlivcLivePusher livePusher = AlivcLivePusher.init();

/// Create a Config object to associate AlivcLivePushConfig with AlivcLivePusher.
livePusher.createConfig();

/// Create an AlivcLivePushConfig instance.
AlivcLivePushConfig pusherConfig = AlivcLivePushConfig.init();

/// Configure stream ingest parameters.
/// Set the resolution to 540P.
pusherConfig.setResolution(AlivcLivePushResolution.resolution_540P);
/// Specify the frame rate. We recommend that you set it to 20 frames per second (FPS).
pusherConfig.setFps(AlivcLivePushFPS.fps_20);
/// Specify whether to enable adaptive bitrate streaming. The default value is true.
pusherConfig.setEnableAutoBitrate(true);
/// Specify the group of pictures (GOP) size. A larger value indicates a higher latency. We recommend that you set it to a number from 1 to 2.
pusherConfig.setVideoEncodeGop(AlivcLivePushVideoEncodeGOP.gop_2);
/// Specify the reconnection duration. The value cannot be less than 1000. Unit: milliseconds. We recommend that you use the default value.
pusherConfig.setConnectRetryInterval(2000);
/// Disable the mirroring mode for preview.
pusherConfig.setPreviewMirror(false);
/// Set the stream orientation to portrait.
pusherConfig.setOrientation(AlivcLivePushOrientation.portrait);

Démarrer l'ingestion de flux

  1. Créez le moteur livePusher.

    livePusher.initLivePusher();
  2. Enregistrez les écouteurs pour les événements d'ingestion de flux.

    /// Set the listener for the stream ingest status.
    livePusher.setInfoDelegate();
    /// Set the listener for stream ingest errors.
    livePusher.setErrorDelegate();
    /// Set the listener for the network status during stream ingest.
    livePusher.setNetworkDelegate();
  3. Configurez les rappels liés à l'ingestion de flux.

    /// Listener for stream ingest errors
    /// Configure the callback for SDK errors
    livePusher.setOnSDKError((errorCode, errorDescription) {});
    /// Configure the callback for system errors
    livePusher.setOnSystemError((errorCode, errorDescription) {});
    
    /// Listener for the stream ingest status
    /// Configure the callback for preview start
    livePusher.setOnPreviewStarted(() {});
    /// Configure the callback for preview stop
    livePusher.setOnPreviewStoped(() {});
    /// Configure the callback for first frame rendering
    livePusher.setOnFirstFramePreviewed(() {});
    /// Configure the callback for start of stream ingest
    livePusher.setOnPushStarted(() {});
    /// Configure the callback for pause of camera stream ingest
    livePusher.setOnPushPaused(() {});
    /// Configure the callback for resume of camera stream ingest
    livePusher.setOnPushResumed(() {});
    /// Configure the callback for restart of stream ingest
    livePusher.setOnPushRestart(() {});
    /// Configure the callback for end of stream ingest
    livePusher.setOnPushStoped(() {});
    
    /// Listener for the network status during stream ingest
    /// Configure the callback for failed connections
    livePusher.setOnConnectFail((errorCode, errorDescription) {});
    /// Configure the callback for network recovery
    livePusher.setOnConnectRecovery(() {});
    /// Configure the callback for disconnection
    livePusher.setOnConnectionLost(() {});
    /// Configure the callback for poor network connections
    livePusher.setOnNetworkPoor(() {});
    /// Configure the callback for failed reconnections
    livePusher.setOnReconnectError((errorCode, errorDescription) {});
    /// Configure the callback for reconnection start
    livePusher.setOnReconnectStart(() {});
    /// Configure the callback for successful reconnection
    livePusher.setOnReconnectSuccess(() {});
  4. Créez une vue d'aperçu pour l'ingestion de flux.

    var x = 0.0; // The custom value
    var y = 0.0; // The custom value
    var width = MediaQuery.of(context).size.width; // The custom value
    var height = MediaQuery.of(context).size.height; // The custom value
    AlivcPusherPreview pusherPreviewView = AlivcPusherPreview(
          onCreated: _onPusherPreviewCreated,
          x: x,
          y: y,
          width: width,
          height: height);
      return Container(
            color: Colors.black,
            width: width,
            height: height,
            child: pusherPreviewView);
  5. Démarrez l'aperçu.

    /// Callback for preview creation
    _onPusherPreviewCreated(id) {
         /// Start preview
        livePusher.startPreview();
    }
    Remarque

    Supposons que l'orientation de l'écran du projet Flutter soit verticale (portrait) et que vous appeliez setOrientation pour définir l'orientation sur horizontale (paysage). Après avoir créé un aperçu et appelé startPreview pour démarrer celui-ci, la vidéo risque de ne pas remplir entièrement la fenêtre d'aperçu. Nous vous recommandons d'ajouter un court délai avant d'invoquer startPreview.

    Par exemple : Future.delayed(Duration(milliseconds: 100));

  6. Démarrez l'ingestion de flux. Vous ne pouvez lancer l'ingestion qu'après le succès de l'aperçu.

    String pushURL = "Test ingest URL (rtmp://......)"; 
    livePusher.startPushWithURL(pushURL);
    Remarque
    • Les URL d'ingestion RTMP et RTS (artc://) sont prises en charge. Pour générer des URL d'ingestion, consultez la rubrique Générer des URL de flux en direct.

    • ApsaraVideo Live ne permet pas d'ingérer plusieurs flux vers la même URL simultanément. La deuxième demande d'ingestion sera rejetée.

Méthodes liées à l'ingestion

/// Pause stream ingest from the camera. You can call setPauseImg to configure the image displayed during the pause. Then, call the pause method to switch from camera feeds to the specified image. The audio stream continues to be ingested.
livePusher.pause();
/// Resume stream ingest to switch from image to camera feeds. The audio stream continues to be ingested.
livePusher.resume();
/// Stop a stream that is being ingested.
livePusher.stopPush();
/// Stop preview. However, this operation does not take effect for a stream that is being ingested. When preview is stopped, the preview window is frozen at the last frame.
livePusher.stopPreview();
/* Restart stream ingest when the stream is being ingested or when an error callback is received. All resources in AlivcLivePusher are reinitialized, including preview and ingestion. If an error occurs, you can call this method or the reconnectPushAsync method to restart stream ingest. You can also call the destroy method to destroy the stream ingest instance. */
livePusher.restartPush();
/* Reconnect and repush the RTMP stream during streaming or network error state (setNetworkDelegate). In the error state, you can also call destroy to dispose the instance.*/
livePusher.reconnectPushAsync();
/// Stop stream ingest and preview. After you call this method, all resources related to AlivcLivePusher are disposed.
livePusher.destory();

Méthodes liées à la caméra

/// Switch between the front and rear cameras.
livePusher.switchCamera();
/// Enable or disable flash. You cannot enable flash for the front camera.
livePusher.setFlash(false);

/// Adjust the focal length to zoom in or out. If you set the input parameter to a positive number, the system increases the focal length. If you set the input parameter to a negative number, the system decreases the focal length.
double max = await livePusher.getMaxZoom();
livePusher.setZoom(min(1.0, max));

/// Configure manual focus.
/// The autoFocus parameter specifies whether to enable autofocus. This parameter takes effect only for this call. Whether autofocus is enabled depends on the setAutoFocus method.
double pointX = 50.0; // The custom value
double pointY = 50.0; // The custom value
bool autoFocus = true;
livePusher.focusCameraAtAdjustedPoint(pointX, pointY, autoFocus);

/// Disable autofocus.
livePusher.setAutoFocus(false);
/// Disable the mirroring mode for preview.
livePusher.setPreviewMirror(false);
/// Disable the mirroring mode for stream ingest.
livePusher.setPushMirror(false);

Ingérer une image

Vous pouvez ingérer une image statique lorsque l'application est en arrière-plan ou lorsque le débit binaire est faible.

Lorsque l'application passe en arrière-plan, l'ingestion vidéo est suspendue par défaut et seul l'audio continue d'être transmis. Vous pouvez afficher une image pour informer les spectateurs que le diffuseur reviendra sous peu.

/// Specify the image that is ingested during the pause.
String pauseImagePath = "xxxx"; // xxxx specifies the path of the image.
pusherConfig.setPauseImg(pauseImagePath);

Vous pouvez également afficher une image en cas de mauvaises conditions réseau pour éviter les saccades :

/// Specify the image that is ingested in poor network conditions.
String networkPoorImagePath = "xxxx"; // xxxx specifies the path of the image.
pusherConfig.setNetworkPoorImg(networkPoorImagePath);

Configurer le mode d'affichage de l'aperçu

Les modes d'affichage d'aperçu suivants sont disponibles. Le mode d'aperçu n'affecte pas l'ingestion de flux.

  • AlivcPusherPreviewDisplayMode.preview_scale_fill : La vidéo remplit la fenêtre d'aperçu. Si les rapports d'aspect de la vidéo et de la fenêtre d'aperçu diffèrent, la vidéo subit une déformation.

  • AlivcPusherPreviewDisplayMode.preview_aspect_fit : Le rapport d'aspect de la vidéo est préservé. Si les rapports d'aspect diffèrent, des bandes noires apparaissent dans la fenêtre d'aperçu.

  • AlivcPusherPreviewDisplayMode.preview_aspect_fill : La vidéo est recadrée pour s'adapter à la fenêtre d'aperçu lorsque les rapports d'aspect diffèrent.

Exemple de code :

/// Set the preview display mode.
pusherConfig.setPreviewDisplayMode(AlivcPusherPreviewDisplayMode.preview_aspect_fit);

Configurer la qualité vidéo

Trois modes de qualité vidéo sont disponibles : Priorité à la résolution, Priorité à la fluidité et Personnalisé.

Important

Pour configurer la qualité vidéo, vous devez activer le contrôle du débit binaire : pusherConfig.setEnableAutoBitrate(true);

Priorité à la résolution (par défaut)

Le SDK configure automatiquement les paramètres de débit binaire pour privilégier la qualité vidéo.

pusherConfig.setQualityMode(AlivcLivePushQualityMode.resolution_first);

Priorité à la fluidité

Le SDK configure automatiquement les paramètres de débit binaire pour privilégier la fluidité du flux.

pusherConfig.setQualityMode(AlivcLivePushQualityMode.fluency_first);

Mode personnalisé

Le SDK utilise les valeurs initiales, minimales et cibles de débit binaire que vous avez spécifiées.

  • TargetVideoBitrate : Dans de bonnes conditions réseau, le débit binaire augmente progressivement jusqu'au débit cible pour améliorer la qualité vidéo.

  • MinVideoBitrate : Dans de mauvaises conditions réseau, le débit binaire est réduit progressivement jusqu'au minimum pour éviter les saccades.

  • InitialVideoBitrate : Débit binaire initial au démarrage d'un flux en direct.

pusherConfig.setQualityMode(AlivcLivePushQualityMode.custom);
pusherConfig.setInitialVideoBitrate(1000);
pusherConfig.setMinVideoBitrate(600);
pusherConfig.setTargetVideoBitrate(1400);

Reportez-vous aux paramètres de débit binaire recommandés ci-dessous :

  • Paramètres recommandés pour le mode Priorité à la résolution

    Résolution

    Débit binaire initial

    Débit binaire minimal

    Débit binaire cible

    360P

    600

    300

    1000

    480P

    800

    300

    1200

    540P

    1000

    600

    1400

    720P

    1500

    600

    2000

    1080P

    1800

    1200

    2500

  • Paramètres recommandés pour le mode Priorité à la fluidité

    Résolution

    Débit binaire initial

    Débit binaire minimal

    Débit binaire cible

    360P

    400

    200

    600

    480P

    600

    300

    800

    540P

    800

    300

    1000

    720P

    1000

    300

    1200

    1080P

    1500

    1200

    2200

Configurer la résolution adaptative

Lorsqu'elle est activée, la résolution adaptative réduit automatiquement la résolution du flux en cas de mauvaises conditions réseau afin de maintenir la fluidité et la qualité :

/// Enable adaptive resolution。
pusherConfig.setEnableAutoResolution(true);
Important
  • La résolution adaptative prend effet uniquement lorsque le mode de qualité vidéo est défini sur Priorité à la résolution ou Priorité à la fluidité.

  • Certains lecteurs peuvent ne pas prendre en charge la résolution dynamique. Nous vous recommandons d'utiliser ApsaraVideo Player.

Configurer la musique de fond

/// Start the playback of background music。
String musicPath = "xxxx"; // xxxx specifies the path in which the music resources are stored.
livePusher.startBGMWithMusicPathAsync(musicPath);
/// Stop the playback of background music. If you want to change the background music, call the method that is used to start the playback of background music. You do not need to stop the playback of the current background music.
livePusher.stopBGMAsync();
/// Pause the playback of background music. You can call this method only after the playback of background music starts.
livePusher.pauseBGM();
/// Resume the playback of background music. You can call this method only after the playback of background music is paused.
livePusher.resumeBGM();
/// Enable looping.
livePusher.setBGMLoop(true);
/// Configure denoising. When enabled, the system filters out non-vocal parts from the collected audio. This feature may slightly reduce the volume of the human voice. We recommend that you allow your users to determine whether to enable this feature. By default, this feature is disabled.
livePusher.setAudioDenoise(true);
/// Configure in-ear monitoring. In-ear monitoring is suitable for karaoke scenarios. When enabled, headphone users can hear their voice. When disabled, they cannot hear their voice on headphones. This parameter does not take effect if no headphones are detected. 
livePusher.setBGMEarsBack(true);
/// Specify the volume of the background music in the mixed audio.
livePusher.setBGMVolume(50); // Valid values: 0 to 100. Default value: 50
/// Specify the volume of the human voice in the mixed audio.
livePusher.setCaptureVolume(50); // Valid values: 0 to 100. Default value: 50
/// Configure muting. If you enable this feature, the background music and human voice are muted. To separately mute the background music or human voice, call the method that is used to configure the volume.
livePusher.setMute(true);

Configurez les rappels liés à la musique de fond :

/// Configure the callback for end of playback of background music.
livePusher.setOnBGMCompleted(() {});
/// Configure the callback for timeout of the download of background music.
livePusher.setOnBGMDownloadTimeout(() {});
/// Configure the callback for failed playback of background music.
livePusher.setOnBGMOpenFailed(() {});
/// Configure the callback for paused playback of background music.
livePusher.setOnBGMPaused(() {});
/// Configure the callback for playback progress.
livePusher.setOnBGMProgress((progress, duration) {});
/// Configure the callback for resumed playback of background music.
livePusher.setOnBGMResumed(() {});
/// Configure the callback for start of playback of background music.
livePusher.setOnBGMStarted(() {});
/// Configure the callback for stop of playback of background music.
livePusher.setOnBGMStoped(() {});

Capturer des instantanés

/// Capture a snapshot.
String dir = "xxxx"; // xxxx specifies the path in which snapshots are stored.
if (Platform.isIOS) {
    /// dir parameter: On iOS, the path is a relative path. A custom directory is automatically generated in the system sandbox. If you set this parameter to "", snapshots are stored in the root directory of the system sandbox.
    /// dirTypeForIOS parameter: Optional. If you do not specify this parameter, snapshots are stored in the [document] directory of the system sandbox.
    livePusher.snapshot(1, 0, dir, dirTypeForIOS: AlivcLiveSnapshotDirType.document);
} else {
    livePusher.snapshot(1, 0, dir);
}
/// Set the listener for snapshot capture. You can call this method only after you call snapshot.
livePusher.setSnapshotDelegate();

/// Configure callbacks related to snapshot capture.
livePusher.setOnSnapshot((saveResult, savePath, {dirTypeForIOS}) {
  	// The callback that is triggered when a snapshot is stored.
    if (saveResult == true) {
      if (Platform.isIOS) {
        // Construct the full path of snapshots in the system sandbox. Format: dirTypeForIOS + savePath.
      } else {
        // Obtain the path of snapshots based on the value of savePath.
      }
    }
  });

Configurer les filigranes

Le SDK Push pour Android permet d'ajouter un ou plusieurs filigranes au format PNG. Exemple de code :

String watermarkBundlePath = "xxxx"; //xxxx specifies the path in which the watermark image is stored.
double coordX = 0.1;
double coordY = 0.1;
double width = 0.3;
/// Add a watermark.
livePusher.addWatermark(watermarkBundlePath, coordX, coordY, width);

Où :

  • coordX et coordY sont des valeurs relatives qui déterminent la position du filigrane. coordX=0,1 signifie que le bord gauche du filigrane est positionné à 10 % de la largeur du flux. Lorsque la résolution est de 540 x 960, la position x est de 540 x 0,1 = 54 pixels.

  • width spécifie la largeur du filigrane par rapport à la largeur du flux. La hauteur est mise à l'échelle proportionnellement.

Remarque
  • Pour ajouter un filigrane textuel, convertissez le texte en image PNG, puis appelez cette méthode pour ajouter l'image en tant que filigrane.

  • Pour garantir la clarté et la netteté des contours du filigrane, nous vous recommandons d'utiliser une image source ayant la même taille que votre configuration. Par exemple, si la résolution de la vidéo de sortie est de 544 × 940 et que la largeur du filigrane est définie sur 0,1f, la largeur recommandée pour l'image source est de 544 × 0,1f = 54,4 pixels.

Transmettre des sources audio/vidéo externes

Le SDK Push pour Android prend en charge l'ingestion de sources audio/vidéo externes, telles qu'un fichier vidéo.

Avant l'ingestion, activez l'entrée audio et vidéo personnalisée.

/// Enable custom audio and video input.
pusherConfig.setExternMainStream(true);
/// Specify the color format for video data. In this example, YUVNV21 is used. You can also use other formats based on your business requirements.
pusherConfig.setExternVideoFormat(AlivcLivePushVideoFormat.YUVNV21);
/// Specify the bit depth format for audio data. In this example, S16 is used. You can also use other formats based on your business requirements.
pusherConfig.setExternMainStream(AlivcLivePushAudioFormat.S16);

Une fois l'entrée personnalisée activée, vous pouvez transmettre des flux audio et vidéo externes.

Transmettre des données vidéo externes

/// Only continuous buffer data in the YUV or RGB format can be sent by using the sendVideoData method. You can specify the video buffer, length, width, height, timestamp, and rotation angle.
Uint8List bufferData = xxxx; // xxxx indicates the continuous video buffer data in the Uint8List format.
int width = 720; // The video width.
int height = 1280; // The video height.
int dataSize = xxxx; // xxxx indicates the size of the data.
int pts = xxxx; // xxxx indicates the timestamp in microseconds.
int rotation = 0; // The rotation angle.
livePusher.sendVideoData(bufferData, width, height, size, pts, rotation);

Transmettre des données audio externes

/// Only continuous buffer data in the PCM format can be sent by using the sendPCMData method. You can specify the audio buffer, length, and timestamp.
Uint8List bufferData = xxxx; // xxxx indicates the continuous audio buffer data in the Uint8List format.
int dataSize = xxxx; // xxxx indicates the size of the data.
int sampleRate = xxxx; // xxxx indicates the audio sample rate.
int channel = 0; // The number of sound channels.
int pts = xxxx; // xxxx indicates the timestamp in microseconds.
livePusher.sendPCMData(bufferData, size, sampleRate, channel, pts);

Obtenir le numéro de version du SDK Push natif

/// Obtain the version number of the native Push SDK.
String sdkVersion = await AlivcLiveBase.getSdkVersion();

Configurer les journaux

/// Enable log printing in the console.
AlivcLiveBase.setConsoleEnable(true);
/// Set the log level to Debug.
AlivcLiveBase.setLogLevel(AlivcLivePushLogLevel.debug);

/// Specify the maximum size of each shard. The total log size is five times the maximum shard size.
const int saveLogMaxPartFileSizeInKB = 100 * 1024 * 1024;
/// Log path.
String saveLogDir = "TODO";
/// Specify the log path and log shard size。
AlivcLiveBase.setLogPath(saveLogDir, saveLogMaxPartFileSizeInKB);

Réinitialiser l'objet de configuration (iOS)

Appelez cette méthode pour effacer les paramètres AlivcLivePushConfig sur iOS. La prochaine instance AlivcLivePusher utilisera les paramètres par défaut.

Nous vous recommandons d'appeler cette méthode après avoir invoqué la méthode destroy pour AlivcLivePusher.

/// Reset the Config object on iOS.
livePusher.destroyConfigForIOS();

Ajouter des effets de retouche

Les effets de retouche sont fournis via le plug-in flutter_livepush_beauty_plugin, situé dans le répertoire example\plugins du package SDK.

Remarque

Le plug-in de retouche n'est pas publié séparément.

/// 1. Initialize the retouching object.
AlivcLiveBeautyManager beautyManager = AlivcLiveBeautyManager.init();
beautyManager.setupBeauty();
/// 2. Show the retouching panel.
beautyManager.showPanel();
/// 3. Close the retouching panel (for Android).
beautyManager.hidePanel();
/// 4. Dispose the retouching object.
beautyManager.destroyBeauty();

FAQ

Comment résoudre les échecs d'ingestion de flux ?

Utilisez l'outil de dépannage pour vérifier si l'URL d'ingestion est valide.

Comment obtenir des informations sur les flux ingérés ?

Accédez à la page Gestion des flux et consultez les flux audio et vidéo ingérés dans la section Active Streams.

Comment lire un flux ?

Après avoir démarré l'ingestion de flux, utilisez un lecteur (tel que ApsaraVideo Player, FFplay ou VLC) pour tester la récupération du flux. Pour obtenir les URL de lecture, consultez la rubrique Générer des URL de flux en direct.