Tous les produits
Search
Centre de documentation

ApsaraVideo Live:Utiliser le Push SDK pour Android

Dernière mise à jour :Aug 19, 2026

Découvrez comment enregistrer, configurer et utiliser le Push SDK pour Android afin d'ingérer des flux en direct, avec des exemples pour la capture caméra, le partage d'écran, les retouches et bien plus encore.

Fonctionnalités

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

  • Prend en charge l'ingestion et la lecture de flux RTS basées sur la communication en temps réel (RTC).

  • Prend en charge la diffusion conjointe et les battles.

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

  • Permet de personnaliser la configuration de fonctionnalités telles que le contrôle du débit binaire, la résolution et le mode d'affichage.

  • Prend en charge diverses opérations de caméra.

  • Offre 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.

  • Permet de diffuser des enregistrements d'écran.

  • Prend en charge les entrées audio et vidéo externes dans différents formats, tels que YUV et PCM (modulation par impulsions et codage).

  • Prend en charge le mixage de plusieurs flux.

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

  • Prend en charge la musique de fond.

  • Prend en charge la capture d'instantanés vidéo.

  • Gère automatiquement la reconnexion et les erreurs.

  • Intègre les algorithmes de contrôle automatique du gain (AGC), de réduction automatique du bruit (ANR) et d'annulation d'écho acoustique (AEC).

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

Limitations

Tenez compte des limitations suivantes avant d'utiliser le Push SDK pour Android :

  • Vous devez configurer l'orientation de l'écran avant l'ingestion du flux. Il est impossible de faire pivoter l'écran pendant le streaming en direct.

  • Vous devez désactiver 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. Vous devez adapter la taille de l'écran du lecteur à la résolution de sortie pour éviter l'apparition de bandes noires.

Référence de l'API

Référence de l'API (édition Basic)

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

Pour obtenir et configurer une licence, intégrez une licence Push SDK.

Remarque

L'enregistrement du SDK est obligatoire avant toute utilisation des fonctionnalités d'ingestion de flux.

Appelez l'API d'enregistrement de licence au début du cycle de vie de votre application, avant d'utiliser le Push SDK pour Android.

AlivcLiveBase.setListener(new AlivcLiveBaseListener() {
  @Override
  public void onLicenceCheck(AlivcLivePushConstants.AlivcLiveLicenseCheckResultCode result, String reason) {
    Log.e(TAG, "onLicenceCheck: " + result + ", " + reason);
  }
});
AlivcLiveBase.registerSDK();
  • Utilisez la classe AlivcLiveBase pour définir les niveaux de journalisation, spécifier les chemins d'accès locaux aux journaux et obtenir la version du SDK.

  • Vous devez appeler la méthode registerSDK dans AlivcLiveBase pour enregistrer la licence du SDK.

  • Implémentez le rappel onLicenceCheck dans l'interface AlivcLiveBase#setListener pour vérifier de manière asynchrone la configuration de la licence.

    Remarque

    Ce rappel n'est déclenché qu'après l'initialisation de l'instance de l'outil de push.

Configurer les paramètres d'ingestion de flux

Les paramètres d'ingestion de flux disposent de valeurs par défaut qui ne nécessitent aucune configuration supplémentaire.

// Initialize the stream ingest configuration class.
AlivcLivePushConfig mAlivcLivePushConfig = new AlivcLivePushConfig();
// Set the stream ingest mode. The default is the basic mode.
mAlivcLivePushConfig.setLivePushMode(AlivcLiveMode.AlivcLiveBasicMode);
// Set the resolution. The default is 540p.
mAlivcLivePushConfig.setResolution(AlivcResolutionEnum.RESOLUTION_540P);
// Set the frame rate. The default is 25 fps.
mAlivcLivePushConfig.setFps(AlivcFpsEnum.FPS_25);
// Set the video encoding GOP size in seconds. The default is 2 seconds.
mAlivcLivePushConfig.setVideoEncodeGop(AlivcVideoEncodeGopEnum.GOP_TWO);
// Enable bitrate control. This is enabled by default.
mAlivcLivePushConfig.setEnableBitrateControl(true);
// Set the screen orientation. The default is portrait. You can also set it to landscape with the home button on the left or right.
mAlivcLivePushConfig.setPreviewOrientation(AlivcPreviewOrientationEnum.ORIENTATION_PORTRAIT);
// Set the audio encoding profile. The default is AAC-LC.
mAlivcLivePushConfig.setAudioProfile(AlivcAudioAACProfileEnum.AAC_LC);
// Set the video encoding mode. The default is hardware encoding.
mAlivcLivePushConfig.setVideoEncodeMode(AlivcEncodeModeEnum.Encode_MODE_HARD);
// Set the audio encoding mode. The default is software encoding.
mAlivcLivePushConfig.setAudioEncodeMode(AlivcEncodeModeEnum.Encode_MODE_SOFT);
// Set the camera type. The default is the front camera.
mAlivcLivePushConfig.setCameraType(AlivcLivePushCameraTypeEnum.CAMERA_TYPE_FRONT);
// Set the image to display when the app is in the background or stream ingest is paused.
mAlivcLivePushConfig.setPausePushImage("TODO: Image Path");
// Set the image to display in poor network conditions.
mAlivcLivePushConfig.setNetworkPoorPushImage("TODO: Image Path");
Important
  • Définissez la résolution sur 540p pour obtenir un équilibre optimal entre les performances de l'appareil et la bande passante.

  • La désactivation du contrôle du débit binaire fige le débit à sa valeur initiale sans adaptation aux conditions réseau, ce qui peut provoquer des saccades lors de la lecture.

Ingérer un flux caméra

  1. Initialisation.

    Appelez la méthode init après avoir configuré les paramètres d'ingestion de flux :

    AlivcLivePusher mAlivcLivePusher = new AlivcLivePusher();
    mAlivcLivePusher.init(mContext, mAlivcLivePushConfig);
    Remarque

    AlivcLivePusher ne prend pas en charge les instances multiples. Chaque appel à init doit être associé à un appel à destroy.

  2. Enregistrez les rappels de prévisualisation.

    Appelez la méthode setLivePushInfoListener pour enregistrer les rappels de prévisualisation :

    /**
     * Set a listener for stream ingest event notifications.
     *
     * @param infoListener The notification listener.
     */
    mAlivcLivePusher.setLivePushInfoListener(new AlivcLivePushInfoListener() {
        @Override
        public void onPreviewStarted(AlivcLivePusher pusher) {
            // Notification that the preview has started.
        }
        // Other override methods
        //....
        //....
    });
  3. Démarrez la prévisualisation.

    Démarrez la prévisualisation en transmettant le SurfaceView pour la prévisualisation de la caméra :

    mAlivcLivePusher.startPreview(mSurfaceView); // Starts the preview. You can also call the asynchronous startPreviewAsync method based on your needs.
  4. Démarrez l'ingestion de flux.

    Ajoutez le code suivant dans la méthode de rappel onPreviewStarted.

    mAlivcLivePusher.startPush(mPushUrl);
    Remarque
    • Les URL d'ingestion pour RTMP et RTS (artc://) sont prises en charge. Pour obtenir les URL, consultez la section Générer des URL d'ingestion et de diffusion.

    • ApsaraVideo Live rejette les demandes d'ingestion de flux concurrentes vers la même URL.

Méthodes courantes d'ingestion de flux

Le SDK fournit des méthodes pour contrôler le cycle de vie du flux : démarrage, arrêt, pause, reprise, redémarrage, reconnexion et suppression.

/* Call to pause a stream that is being ingested. After pausing, the video preview and video stream ingest are held on the last frame, while audio stream ingest continues. */
mAlivcLivePusher.pause();
/* Call to resume a paused stream. After resuming, the audio and video preview and stream ingest return to normal. */
mAlivcLivePusher.resume();
/* Call to stop a stream that is being ingested. After completion, stream ingest stops. */
mAlivcLivePusher.stopPush();
/* Call to stop the preview only when in the previewing state. Calling this while ingesting a stream has no effect. After the preview stops, the preview frame freezes on the last frame. */
mAlivcLivePusher.stopPreview();
/* Call to restart stream ingest when a stream is being ingested or after receiving any error-related callback. In an error state, you can only call this API, reconnectPushAsync, or destroy. Restarting reinitializes all internal resources of AlivcLivePusher, including preview and stream ingest. */
mAlivcLivePusher.restartPush();
/* Call to reconnect a stream when it is being ingested or after receiving an error callback related to AlivcLivePusherNetworkDelegate. In an error state, you can only call this API, restartPush, or destroy. Reconnecting re-establishes the RTMP connection for stream ingest. */
mAlivcLivePusher.reconnectPushAsync();
/* Call to dispose of the stream ingest instance. After disposal, stream ingest and preview stop, and the preview surface is removed. All resources related to AlivcLivePusher are released. */
mAlivcLivePusher.destroy();

Opérations de caméra

Basculez entre les caméras, activez ou désactivez le flash, et ajustez la mise au point, le zoom et la mise en miroir pendant l'ingestion de flux, la pause ou la reconnexion :

/* Switch between the front and rear cameras. */
mAlivcLivePusher.switchCamera();
/* Turn the flash on or off. Turning on the flash has no effect when the front camera is active. */
mAlivcLivePusher.setFlash(true); 
/* Adjust the focal length to zoom the captured image. The zoom range is [0, getMaxZoom()]. */
mAlivcLivePusher.setZoom(5);
/* Manually focus the camera. This requires two parameters: 1. `point` (the coordinates of the point to focus on) and 2. `autoFocus` (whether to enable autofocus for this specific operation). Subsequent autofocus behavior follows the value set by the setAutoFocus API. */
mAlivcLivePusher.focusCameraAtAdjustedPoint(x, y, true);
/* Set whether to enable autofocus. */
mAlivcLivePusher.setAutoFocus(true);
/* Configure mirroring. There are two mirroring APIs: PushMirror for the ingested stream and PreviewMirror for the local preview. PushMirror affects only the playback display, while PreviewMirror affects only the preview display. They do not affect each other. */
mAlivcLivePusher.setPreviewMirror(false);
mAlivcLivePusher.setPushMirror(false);
Important

Les API de caméra sont disponibles uniquement après le démarrage de la prévisualisation.

Ingérer un flux de partage d'écran

Le partage d'écran utilise MediaProjection et nécessite l'autorisation de l'utilisateur. Transmettez les données de résultat de l'autorisation au SDK. La caméra est désactivée par défaut pendant le partage d'écran.

Configurer le partage d'écran

// resultData is the screen sharing system intent.
mAlivcLivePushConfig.setMediaProjectionPermissionResultData(resultData);

Configurer la rotation de l'écran

Définissez l'angle de rotation de l'écran pour prendre en charge l'enregistrement en mode paysage et portrait pendant le partage d'écran :

mAlivcLivePusher.setScreenOrientation(0);
Remarque

Vous devez écouter l'événement OrientationEventListener au niveau de la couche application et définir l'angle de rotation via cette API lorsque l'orientation de l'écran change.

Configurer la protection de la vie privée

Activez la protection de la vie privée pendant le partage d'écran pour masquer les saisies sensibles, telles que les mots de passe :

mAlivcLivePusher.pauseScreenCapture(); // Enable privacy protection.
mAlivcLivePusher.resumeScreenCapture(); // Disable privacy protection.
Remarque

Cette action met en pause le partage d'écran. Si setPausePushImage est défini dans la configuration, les spectateurs voient l'image spécifiée. Sinon, ils voient la dernière image avant la pause.

Ingérer des flux caméra et de partage d'écran

Vous pouvez activer l'ingestion caméra pendant le partage d'écran. Deux approches sont disponibles :

  1. Le diffuseur dispose d'une prévisualisation caméra.

    Le diffuseur et les spectateurs peuvent tous deux voir le flux de la caméra.

  2. Le diffuseur ne dispose pas de prévisualisation caméra.

    Par exemple, lors d'une diffusion de jeu, le diffuseur peut ne pas souhaiter que la vue de la caméra obstrue le jeu. Cependant, les spectateurs peuvent toujours voir le flux de la caméra du diffuseur dans le flux final.

Le diffuseur peut voir la prévisualisation caméra

Une fois le partage d'écran démarré, appelez l'API pour démarrer ou arrêter la prévisualisation caméra.

mAlivcLivePusher.startCamera(surfaceView); // Start the camera preview.
mAlivcLivePusher.stopCamera(); // Stop the camera preview.
Remarque
  • Définissez le rapport d'aspect de la prévisualisation caméra surfaceView sur 1:1 pour éviter les ajustements lors de la rotation de l'écran.

  • Si le rapport d'aspect n'est pas de 1:1, vous devez ajuster le ratio du surfaceView lors de la rotation de l'écran, puis appeler stopCamera suivi de startCamera.

  • Si le diffuseur n'a pas besoin de prévisualisation, définissez surfaceview sur null.

Le diffuseur ne peut pas voir la prévisualisation caméra

Activez le mixage du flux caméra pour inclure le flux de la caméra dans la diffusion sans prévisualisation locale.

mAlivcLivePusher.startCameraMix(x, y, w, h); // Enable camera stream mixing and set the x, y, w, and h layout for the mixed stream.
mAlivcLivePusher.stopCameraMix(); // Stop camera stream mixing.

Mode d'affichage de la prévisualisation

Trois modes d'affichage de prévisualisation sont disponibles. Le mode d'affichage n'affecte pas l'ingestion de flux.

  • ALIVC_LIVE_PUSHER_PREVIEW_SCALE_FILL : La vidéo remplit la fenêtre de prévisualisation. Si les rapports d'aspect de la vidéo et de la fenêtre diffèrent, la prévisualisation apparaît déformée.

  • ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT : Le rapport d'aspect de la vidéo est préservé. Si les rapports d'aspect de la vidéo et de la fenêtre diffèrent, des bandes noires apparaissent dans la prévisualisation.

  • ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FILL : La vidéo est recadrée pour s'adapter au rapport d'aspect de la fenêtre. Si les rapports d'aspect diffèrent, la vidéo est recadrée.

Le code suivant fournit un exemple :

mAlivcLivePushConfig.setPreviewDisplayMode(AlivcPreviewDisplayMode.ALIVC_LIVE_PUSHER_PREVIEW_ASPECT_FIT);

Ingestion de flux d'images

Le SDK peut ingérer une image de remplacement lorsque l'application est en arrière-plan ou que le réseau est de mauvaise qualité.

Lorsque l'application passe en arrière-plan, l'ingestion vidéo est mise en pause tandis que l'audio continue. Affichez une image de remplacement pour informer les spectateurs :

mAlivcLivePushConfig.setPausePushImage("path/to/background.png"); // Set the image for background stream ingest.

Le SDK ingère cette image lorsqu'il détecte un faible débit binaire, réduisant ainsi les saccades vidéo :

mAlivcLivePushConfig.setNetworkPoorPushImage("path/to/network_poor.png"); // Set the image to ingest in poor network conditions.

Ingestion de flux audio uniquement

mAlivcLivePushConfig.setAudioOnly(true);

Ingérer des flux audio et vidéo externes

Le SDK prend en charge l'ingestion d'audio et de vidéo provenant de sources externes, telles que des fichiers vidéo.

Activez d'abord l'entrée audio et vidéo personnalisée :

L'ingestion de flux audio et vidéo externes est prise en charge à partir du SDK 7.8.0. Les opérations principales sont setExternMainStream (active l'entrée audio et vidéo personnalisée), inputStreamAudioData (ingère un flux audio externe) et inputStreamVideoData (ingère un flux vidéo externe). Le SDK 7.11.0 optimise principalement la logique d'expiration de l'authentification client et ajoute un rappel d'erreur de capture vidéo ; il n'introduit pas l'ingestion de flux externes, vous n'avez donc pas besoin de mettre à niveau uniquement pour cette fonctionnalité.

/**
* Other parameters such as output resolution, audio sample rate, and number of channels are set in the config object
* using setResolution, setAudioSampleRate, and setAudioChannels.
*/
mAlivcLivePushConfig.setExternMainStream(true,AlivcImageFormat.IMAGE_FORMAT_YUVNV12,AlivcSoundFormat.SOUND_FORMAT_S16);

Après avoir activé l'entrée audio et vidéo personnalisée, vous pouvez ingérer des flux externes.

Ingérer un flux audio externe

/**
* This API does not control timing. The caller must control the timing of the input audio frames.
*/
mAlivcLivePusher.inputStreamAudioData(byte[] data, int size, int sampleRate, int channels, long pts);

Ingérer un flux vidéo externe

/**
* This API does not control timing. The caller must control the timing of the input video frames.
*/
mAlivcLivePusher.inputStreamVideoData(byte[] data, int width, int height, int stride, int size, long pts, int rotation);

Le Push SDK ne prend pas en charge le protocole RTSP. Pour ingérer un flux RTSP depuis une caméra réseau (caméra IP), décodez d'abord le flux au format YUV/PCM, puis ingérez-le à l'aide des API inputStreamAudioData/inputStreamVideoData.

Outils de décodage disponibles :

  • FFmpeg : Prend en charge l'entrée RTSP et peut décoder en YUV420p et PCM s16le. Exemple de commande : ffmpeg -rtsp_transport tcp -i rtsp://camera_ip/stream -an -c:v rawvideo -pix_fmt yuv420p output.yuv

  • GStreamer : Prend en charge l'entrée RTSP et peut décoder en YUV420p et PCM s16le.

  • MediaCodec : Une API du framework Android (android.media.MediaCodec) qui prend en charge le décodage matériel H.264 vers YUV à partir d'Android 4.1 (niveau d'API 16).

Le format des données décodées doit correspondre à votre configuration SDK : définissez le format vidéo sur IMAGE_FORMAT_YUVNV12 et le format audio sur SOUND_FORMAT_S16.

Configurer les filigranes

Ajoutez un ou plusieurs filigranes au format PNG :

mAlivcLivePushConfig.addWaterMark(waterPath,0.1,0.2,0.3); // Add a watermark.
Remarque
  • Les paramètres x, y et width sont des valeurs relatives. Par exemple, x=0,1 signifie que la coordonnée x du filigrane se situe à 10 % de la largeur du flux. Si la résolution du flux est de 540x960, la coordonnée x du filigrane sera de 54.

  • La hauteur de l'image du filigrane est mise à l'échelle proportionnellement en fonction de son rapport d'aspect d'origine et de la valeur de largeur fournie.

  • Pour implémenter un filigrane textuel, convertissez d'abord le texte en image, puis utilisez cette API pour l'ajouter en tant que filigrane.

Configurer la qualité vidéo

Trois modes de qualité vidéo sont pris en charge : mode Priorité à la résolution, mode Priorité à la fluidité et mode Personnalisé.

Important

Pour définir la qualité vidéo, vous devez activer le contrôle du débit binaire : mAlivcLivePushConfig.setEnableBitrateControl(true);

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

Le SDK privilégie la clarté vidéo en configurant automatiquement les paramètres de débit binaire.

mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_RESOLUTION_FIRST); // Prioritize resolution.

Mode Priorité à la fluidité

Le SDK privilégie la fluidité vidéo en configurant automatiquement les paramètres de débit binaire.

mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_FLUENCY_FIRST); // Prioritize fluency.

Mode Personnalisé

Le SDK utilise vos paramètres de débit binaire. Définissez les valeurs de débit binaire initial, minimum et cible.

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

  • Débit binaire minimum : Dans de mauvaises conditions réseau, le débit binaire diminue progressivement jusqu'au débit minimum pour réduire les saccades vidéo.

  • Débit binaire initial : Le débit binaire au début du streaming en direct.

mAlivcLivePushConfig.setQualityMode(AlivcQualityModeEnum.QM_CUSTOM); // Custom mode
mAlivcLivePushConfig.setTargetVideoBitrate(1000); // Target bitrate: 1,000 kbit/s
mAlivcLivePushConfig.setMinVideoBitrate(300); // Minimum bitrate: 300 kbit/s
mAlivcLivePushConfig.setInitialVideoBitrate(800); // Initial bitrate: 800 kbit/s

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

Tableau 1. Paramètres recommandés pour le mode Priorité à la résolution

Résolution

initialVideoBitrate

minVideoBitrate

targetVideoBitrate

360p

600

300

1000

480p

800

300

1200

540p

1000

600

1400

720p

1500

600

2000

1080p

1800

1200

2500

Tableau 1. Paramètres recommandés pour le mode Priorité à la fluidité

Résolution

initialVideoBitrate

minVideoBitrate

targetVideoBitrate

360p

400

200

600

480p

600

300

800

540p

800

300

1000

720p

1000

300

1200

1080p

1500

1200

2200

Résolution adaptative

La résolution adaptative réduit automatiquement la résolution lorsque les conditions réseau sont dégradées afin d'améliorer la fluidité :

mAlivcLivePushConfig.setEnableAutoResolution(true); // Enable adaptive resolution. Default is false.
Important
  • La résolution adaptative fonctionne uniquement en mode Priorité à la résolution ou Priorité à la fluidité, et non en mode Personnalisé.

  • Certains lecteurs ne prennent pas en charge les changements dynamiques de résolution. Utilisez un lecteur Alibaba Cloud pour garantir la compatibilité.

Musique de fond

Le SDK prend en charge la lecture de musique de fond, le mixage audio, la réduction du bruit, la surveillance in-ear (retour casque) et la mise en sourdine :

/* Start playing background music. */
mAlivcLivePusher.startBGMAsync(mPath);
/* Stop playing background music. If BGM is already playing and you need to switch songs, just call the start background music API again. You do not need to stop the current BGM. */
mAlivcLivePusher.stopBGMAsync();
/* Pause background music. This can only be called after BGM has started playing. */
mAlivcLivePusher.pauseBGM();
/* Resume background music. This can only be called when BGM is paused. */
mAlivcLivePusher.resumeBGM();
/* Enable looping for background music. */
mAlivcLivePusher.setBGMLoop(true);
/* Set the denoise switch. When enabled, non-human sounds in the captured audio are filtered. This may slightly suppress human voices. We recommend letting users choose whether to enable this feature. It is disabled by default. */
mAlivcLivePusher.setAudioDenoise(true);
/* Set the in-ear monitoring switch. This feature is mainly used in karaoke scenarios. When enabled with headphones plugged in, the streamer will hear their own voice. When disabled, they will not. This has no effect if headphones are not plugged in. */
mAlivcLivePusher.setBGMEarsBack(true);
/* Configure mixing to adjust the volume of background music and captured voice. */
mAlivcLivePusher.setBGMVolume(50); // Set background music volume.
mAlivcLivePusher.setCaptureVolume(50); // Set captured voice volume.
/* Mute the audio. This mutes both music and voice input. To mute only music or voice, use the mixing volume adjustment APIs. */
mAlivcLivePusher.setMute(true);
Important

Les API de musique de fond sont disponibles uniquement après le démarrage de l'aperçu.

Capture d'écran du flux

Effectuez une capture d'écran du flux vidéo local :

// Take a snapshot of the video stream. Parameters: number of images to capture, interval between each capture in seconds, and a callback listener.
pusher.snapshot(1, 1, new AlivcSnapshotListener() {
    @Override
    public void onSnapshot(Bitmap bmp) {
        // You can save the snapshot to a local PNG file. The following code is an example.
        String dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh-mm-ss-SS").format(new Date());
        File f = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "snapshot-" + dateFormat + ".png");
        if (f.exists()) {
            f.delete();
        }
        try {
            FileOutputStream out = new FileOutputStream(f);
            bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.flush();
            out.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
});

Exécution en arrière-plan et verrouillage de l'écran

  • Lorsque votre application passe en arrière-plan ou que l'écran est verrouillé, appelez les méthodes pause() ou resume() de AlivcLivePusher pour suspendre ou reprendre l'ingestion de flux.

  • Pour les appels audio et vidéo hors système, le SDK capture et ingère le son. Selon vos besoins métier, utilisez l'API mAlivcLivePusher.setMute(true or false) pour déterminer si l'audio doit être capturé lorsque l'application est en arrière-plan ou que l'écran est verrouillé.

Rappels (Callbacks)

Type de rappel

Nom de la classe de rappel

Méthode de configuration

Rappels d'ingestion de flux

AlivcLivePushInfoListener

mAlivcLivePusher.setLivePushInfoListener()

Rappels liés au réseau

AlivcLivePushNetworkListener

mAlivcLivePusher.setLivePushNetworkListener()

Rappels d'erreur

AlivcLivePushErrorListener

mAlivcLivePusher.setLivePushErrorListener()

Rappels de musique de fond

AlivcLivePushBGMListener

mAlivcLivePusher.setLivePushBGMListener()

Rappels d'ingestion de flux

Les rappels d'ingestion de flux notifient l'application des changements d'état du SDK : démarrage de l'aperçu, rendu de la première image, envoi de la première image, démarrage de l'ingestion et arrêt de l'ingestion.

  • onPushStarted : indique une connexion réussie au serveur.

  • onFirstFramePushed : indique que la première image audio ou vidéo a été envoyée avec succès.

  • Les rappels onPushStarted et onFirstFramePushed confirment que le SDK a démarré l'ingestion de flux avec succès.

Rappels liés au réseau

Les rappels réseau signalent l'état de la connexion. Le SDK tente automatiquement de se reconnecter lors de brèves fluctuations du réseau, dans les limites de délai et de tentatives définies dans AlivcLivePushConfig.

  • onConnectFail : l'ingestion de flux a échoué. Vérifiez la validité de l'URL d'ingestion, les problèmes d'authentification, les limites de flux simultanés ou le statut de liste de blocage. Codes d'erreur : 0x30020901–0x30020905, 0x30010900–0x30010901.

  • onConnectionLost : perte de connexion. Le SDK tente automatiquement de se reconnecter, ce qui déclenche onReconnectStart. Si le nombre de tentatives dépasse config.connectRetryCount, onReconnectFail est appelé.

  • onNetworkPoor : le réseau est insuffisant pour une ingestion stable, mais le flux n'est pas interrompu. Utilisez cet événement pour afficher une notification dans l'interface utilisateur.

  • onNetworkRecovery : le réseau est rétabli.

  • onReconnectFail : la reconnexion automatique a échoué après avoir dépassé les limites de délai et de tentatives définies dans AlivcLivePushConfig. Appelez mAlivcLivePusher.reconnectPushAsync pour vous reconnecter manuellement une fois le réseau rétabli.

  • onSendDataTimeout : délai d'envoi des données expiré. Vérifiez le réseau, puis arrêtez et redémarrez l'ingestion de flux.

  • onPushURLAuthenticationOverdue : l'authentification de l'URL d'ingestion a expiré. Fournissez une nouvelle URL au SDK.

Rappels d'erreur

  • onSystemError : erreur système ou matérielle. Libérez le moteur et réessayez.

  • onSDKError : gérez l'erreur en fonction du code d'erreur :

    • Erreur 805438211 : performances matérielles insuffisantes avec un faible taux d'encodage. Informez le diffuseur et arrêtez les opérations gourmandes en ressources, telles que les retouches avancées.

    • Gérez les erreurs d'autorisation manquante : 268455940 (microphone) et 268455939 (caméra).

    • Journalisez toutes les autres erreurs.

Rappels de musique de fond

  • onOpenFailed : le démarrage de la musique de fond a échoué. Vérifiez le chemin d'accès au fichier et le format, puis appelez à nouveau startBGMAsync.

  • onDownloadTimeout : délai de lecture de la musique expiré, généralement lors de la diffusion depuis une URL. Vérifiez le réseau et appelez à nouveau startBGMAsync.

Méthodes et API courantes

Méthodes courantes

/* In Custom mode, you can adjust the minimum and target bitrates in real time. */
mAlivcLivePusher.setTargetVideoBitrate(800);
mAlivcLivePusher.setMinVideoBitrate(400);
/* Check if the camera supports autofocus. */
mAlivcLivePusher.isCameraSupportAutoFocus();
/* Check if the camera supports flash. */
mAlivcLivePusher.isCameraSupportFlash();
/* Get the current stream ingest status. */
mAlivcLivePusher.isPushing(); 
/* Get the ingest URL. */
mAlivcLivePusher.getPushUrl();
/* Get stream ingest performance and debugging information. For details on performance parameters, see the API reference or interface comments. */
mAlivcLivePusher.getLivePushStatsInfo();
/* Get the SDK version number. */
mAlivcLivePusher.getSDKVersion();
/* Set the log level to filter debugging information as needed. */
mAlivcLivePusher.setLogLevel(AlivcLivePushLogLevelAll);
/* Get the current status of the SDK. */
mAlivcLivePusher.getCurrentStatus();
/* Get the last error code. Returns ALIVC_COMMON_RETURN_SUCCESS if there are no errors. */
mAlivcLivePusher.getLastError();

API courantes

Classe

Description

AlivcLivePushConfig

Configuration initiale pour l'ingestion de flux.

AlivcLivePusher

Classe pour les fonctionnalités d'ingestion de flux.

AlivcLivePusherErrorListener

Rappel pour les erreurs.

AlivcLivePusherNetworkListener

Rappel pour les notifications liées au réseau.

AlivcLivePusherInfoListener

Rappel pour les informations d'ingestion de flux.

AlivcLivePusherBGMListener

Rappel pour la musique de fond.

AlivcLivePushCustomFilter

Rappel pour les filtres personnalisés.

AlivcLivePushCustomDetect

Rappel pour la reconnaissance faciale personnalisée.

AlivcSnapshotListener

Rappel pour les captures d'écran.

Intégrer la retouche

Importez la bibliothèque de retouche et configurez les rappels pour activer la fonctionnalité.

Remarque

La retouche nécessite une licence pour le SDK de retouche. Obtenir une licence pour Queen SDK.

  1. Importez la bibliothèque de retouche via Maven. Ajoutez les éléments suivants à votre fichier build.gradle. Consultez la dernière Démo pour connaître la version du SDK.

    implementation "com.aliyun.maliang.android:queen:2.5.0-official-full"
    implementation("com.aliyun.maliang.android:queen_menu:2.5.0-official-full") {
        exclude group: 'com.aliyun.maliang.android', module: 'queen'
    }

    Vous pouvez également intégrer le module LiveBeauty de la démo :

    Fichier ou dossier

    Description

    live_beauty

    Classe abstraite de base pour la retouche.

    queen_beauty

    Contrôles d'interface utilisateur de base pour la retouche.

  2. Obtenez la bibliothèque de plug-ins de retouche LiveBeauty.

    1. Utilisez la commande clone pour télécharger le code de la bibliothèque de plug-ins associée depuis le chemin LiveBeauty vers votre machine locale.

      git clone https://github.com/MediaBox-Demos/amdemos-android-live.git
    2. Ouvrez la ligne de commande dans le répertoire racine de votre projet Android Studio. Exécutez le code suivant, puis utilisez File > New > Import Module pour importer le module LiveBeauty dans votre projet Android.

      git submodule add https://github.com/MediaBox-Demos/amdemos-android-live.git ***/***/***
      Remarque

      Dans l'exemple de code, */**** est un espace réservé pour le chemin d'accès au module LiveBeauty.

    3. Dans le fichier settings.gradle du projet, ajoutez le chemin du module :

      include ':app', ':LiveBeauty', ':LiveBeauty:live_queenbeauty'
      Remarque

      Dans l'exemple de code, « app » est le module principal.

    4. Également, dans le fichier build.gradle du module principal du projet, ajoutez une dépendance au module LiveBeauty :

      dependencies {
          implementation project(':LiveBeauty')
          implementation project(':LiveBeauty:live_queenbeauty')
      }
    5. Cliquez sur File > Sync Project with Gradle Files. Une fois la synchronisation Gradle terminée, vous pouvez utiliser le module LiveBeauty.

  3. Configurez le module d'interface utilisateur du plug-in de retouche.

    1. Ajoutez le contrôle QueenBeautyMenu au fichier XML de mise en page de votre projet. Par exemple :

      <com.aliyunsdk.queen.menu.QueenBeautyMenu
          android:id="@+id/beauty_beauty_menuPanel"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_alignParentBottom="true"
          android:layout_centerHorizontal="true" />
    2. Initialisez QueenBeautyMenu dans l'Activity. Par exemple :

      // Initialize the retouching menu panel.
      QueenMenuPanel beautyMenuPanel = QueenBeautyMenu.getPanel(context);
      beautyMenuPanel.onHideMenu(); 
      beautyMenuPanel.onHideValidFeatures(); 
      beautyMenuPanel.onHideCopyright(); 
      
      // Add the retouching menu to the layout.
      QueenBeautyMenu beautyBeautyContainerView = findViewById(R.id.beauty_beauty_menuPanel);
      beautyBeautyContainerView.addView(beautyMenuPanel);
  4. Définissez les rappels de reconnaissance faciale et de retouche.

    Si vous devez intégrer une bibliothèque de retouche tierce, définissez les rappels setCustomDetect et setCustomFilter.

    • Dans customDetectProcess, le paramètre data est un pointeur vers les données capturées pour le traitement tiers.

    • Dans customFilterProcess, le paramètre inputTexture est la texture d'image à traiter. Renvoyez l'ID de texture traité, ou la inputTexture d'origine si elle n'a pas été modifiée.

    Exemple de code

    /**
     * Facial recognition callback.
     */
    mAlivcLivePusher.setCustomDetect(new AlivcLivePushCustomDetect() {
        @Override
        public void customDetectCreate() {
    
        }
    
        @Override
        public long customDetectProcess(long dataPtr, int width, int height, int rotation, int format, long extra) {
            return 0;
        }
    
        @Override
        public void customDetectDestroy() {
    
        }
    });
    
    /**
     * Retouching callback.
     */
     
    /**
     * Initialize BeautyManager.
     */
    mAlivcLivePusher.setCustomFilter(new AlivcLivePushCustomFilter() {
        @Override
        public void customFilterCreate() {
            initBeautyManager();
        }
    
    /**
     * Process the ingested video stream and add retouching effects.
     */
        @Override
        public int customFilterProcess(int inputTexture, int textureWidth, int textureHeight, long extra) {
            if (mBeautyManager == null) {
                return inputTexture;
            }
    
            return mBeautyManager.onTextureInput(inputTexture, textureWidth, textureHeight);
        }
    
        @Override
        public void customFilterDestroy() {
            destroyBeautyManager();
        }
    });

Remarques d'utilisation

Élément

Description

Règles d'obfuscation

Ajoutez le nom du package du SDK à votre liste d'exclusion ProGuard pour éviter les problèmes d'obfuscation.

-keep class com.alivc.** { *;}

Séquence d'appel d'API

  • Utilisez des API asynchrones pour éviter de bloquer le thread principal.

  • Les API du SDK lèvent des exceptions en cas d'erreur ou d'ordre d'appel incorrect. Encapsulez les appels dans des blocs try-catch.

  • Appelez les API dans l'ordre indiqué dans le diagramme suivant :

    image

FAQ

Pourquoi l'ingestion de flux échoue-t-elle ?

Utilisez l'outil de dépannage pour valider votre URL d'ingestion.

Comment obtenir des informations sur les flux actifs ?

Consultez et gérez les flux actifs sur la page de gestion des flux.

Comment tester la lecture du flux ?

Testez la lecture avec un lecteur Alibaba Cloud, FFplay ou VLC après avoir démarré l'ingestion. Générer des URL d'ingestion et de diffusion.