Tous les produits
Search
Centre de documentation

ApsaraVideo Live:Envoyer et recevoir des messages SEI

Dernière mise à jour :Aug 19, 2026

Le SDK ARTC prend en charge l'envoi et la réception de messages SEI. Utilisez cette fonctionnalité pour transmettre des messages personnalisés depuis le système RTC vers Alibaba Cloud CDN ou des plateformes de streaming tierces.

Présentation

Dans l'encodage vidéo, les informations complémentaires (SEI, Supplemental Enhancement Information) font partie des normes H.264/AVC et H.265/HEVC. Les données SEI transportent des informations supplémentaires parallèlement au contenu vidéo afin d'activer des fonctions telles que la synchronisation du contenu et la récupération après erreur. Parmi les cas d'utilisation courants figurent la mise en page précise des vidéos, la synchronisation des paroles et les quiz interactifs en direct.

image

L'utilisation de SEI est la méthode recommandée pour envoyer des messages personnalisés. Elle intègre les messages dans le flux vidéo pour les livrer aux autres utilisateurs du canal.

  • Avantages :

    • Synchronisation en temps réel : les messages sont synchronisés avec le flux vidéo.

    • Nombre illimité de destinataires : tout utilisateur abonné au flux peut recevoir les messages.

  • Limitations :

    • La taille maximale du message est de 4 Ko afin d'éviter d'impacter le flux vidéo.

Exemple de code

ARTC fournit des exemples de projets open source. Téléchargez ou consultez le code dans les dépôts suivants :

Android : Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/SEIUsage/SEIActivity.java.

iOS : iOS/ARTCExample/BasicUsage/SEIUsage/SEIUsageVC.swift.

Harmony : Harmony/ARTCExample/entry/src/main/ets/pages/basicusage/SEIPage.ets.

Avant de commencer

Assurez-vous de remplir les conditions suivantes :

Implémentation

Envoyer un message SEI

Après avoir publié un flux vidéo, appelez l'API sendMediaExtensionMsg pour envoyer des données SEI.

Référence API

Le SDK ARTC propose deux API pour envoyer des messages SEI.

API

Description

sendMediaExtensionMsg

Paramètres :

  • message : le message d'extension multimédia. Taille maximale : 4 096 octets. Utilisez le format JSON ou une chaîne de caractères simple.

  • repeatCount : le nombre de répétitions du message pour assurer une redondance en cas de perte de paquets. La valeur -1 envoie le message indéfiniment.

  • delay : le délai en millisecondes entre l'appel de l'API et l'envoi du message.

  • isKeyFrame : indique si le message doit être joint uniquement à une image clé.

sendMediaExtensionMsgEx

Étend sendMediaExtensionMsg avec un paramètre payloadType pour le type de message SEI. Valeurs valides : 5 ou 100-254. Définir payloadType=5 équivaut à appeler sendMediaExtensionMsg.

Remarque

Un seul message d'extension multimédia peut être en transit à la fois. Les appels suivants à sendMediaExtensionMsg écrasent le message précédent.

Exemples

Les exemples suivants envoient une chaîne de caractères en tant que message SEI à l'aide de l'API sendMediaExtensionMsg.

Android

// You must have already joined a channel and started publishing a video stream (which is enabled by default).
mSendSEIButton.setOnClickListener(v -> {
    if(mAliRtcEngine == null) {
        return;
    }
    String seiMessage = mEditText.getText().toString();
    if (TextUtils.isEmpty(seiMessage)) {
        return;
    }
    byte[] seiData = seiMessage.getBytes();
    mAliRtcEngine.sendMediaExtensionMsg(seiData,1,0,false);
    // mAliRtcEngine.sendMediaExtensionMsgEx(seiData,1,0,false, 5);
});

iOS

// Send an SEI message.
func sendSEI(seiMessage: String) -> Bool {
    guard let data = seiMessage.data(using: .utf8) else {
        return false
    }
    let repeatCount: Int32 = 1
    let delay: Int32 = 0
    let payloadType: Int32 = 5
    let isKeyFrameOnly = false
    let ret = self.rtcEngine?.sendMediaExtensionMsg(data, repeatCount: repeatCount, delay: delay, isKeyFrame: isKeyFrameOnly)
    // let ret = self.rtcEngine?.sendMediaExtensionMsgEx(data, repeatCount: repeatCount, delay: delay, isKeyFrame: isKeyFrameOnly, payloadType: payloadType)
    debugPrint("sendSEI: \(ret ?? -1)")
    return ret == 0
}

Harmony

const seiData = this.stringToArrayBuffer(this.SendText);
// Send an SEI message.
this.rtcEngine.sendMediaExtensionMsg(seiData, 1, 0, false);

Mac

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
NSDate *datenow = [NSDate date];
NSString *currentTimeString = [formatter stringFromDate:datenow];
NSString *str =@"SEI Test time:" ;

NSString * ExtensionMsg = [str stringByAppendingString:currentTimeString];

NSData *data =[ExtensionMsg dataUsingEncoding:NSUTF8StringEncoding];

int code = [self.engine sendMediaExtensionMsg:data repeatCount:repectCount delay:100 isKeyFrame:true];
NSLog(@"--%d",code);

Windows

/* Specify the following parameters as needed. */
char * data = "xxxxx";
int length = strlen(data);
mAliRtcEngine->SendMediaExtensionMsg(data, length, 1,0,true);

Recevoir un message SEI

Après vous être abonné à un flux vidéo, recevez les données SEI en enregistrant le rappel approprié.

Référence API

Rappel

Description

onMediaExtensionMsgReceived

Déclenché lorsque le SDK reçoit un message SEI.

Paramètres :

  • uid : l'ID utilisateur de l'utilisateur qui a envoyé le message.

  • payloadType : le type de message SEI. La valeur est 5 pour les messages envoyés par sendMediaExtensionMsg. Pour sendMediaExtensionMsgEx, la valeur correspond au type spécifié.

  • message : le message SEI reçu.

Exemples

Android

@Override
public void onMediaExtensionMsgReceived(String uid, int payloadType, byte[]message) {
    super.onMediaExtensionMsgReceived(uid,payloadType, message);

    handler.post(new Runnable() {
        @Override
        public void run() {
            // Process the message.
            String receivedMsg = new String(message);
            ToastHelper.showToast(SEIActivity.this, receivedMsg, Toast.LENGTH_SHORT);
            
        }
    });
}

iOS

extension SEIUsageMainVC: AliRtcEngineDelegate {
    
    // Callback for receiving an SEI message.
    func onMediaExtensionMsgReceived(_ uid: String, payloadType: Int32, message data: Data) {
        // Process the message.
        guard let message = String(data: data, encoding: .utf8) else {
            print("Failed to parse the message")
            return
        }
        self.showToast(message: "Received SEI: \(message), from uid: \(uid), payloadType: \(payloadType)")
    }
    // Other callbacks...

}

Harmony

// Callback for receiving an SEI message.
listener.onMediaExtensionMsgReceived((uid: string, payloadType: number, message: ArrayBuffer) => {
  console.info(`Received SEI message: uid=${uid}, payloadType=${payloadType}, message=${message}`);
});

Mac

- (void)onMediaExtensionMsgReceived:(NSString *)uid payloadType:(int)payloadType message:(NSData *)data {
    
    NSString * string_message  = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];

    NSLog(@"received uid:%@, payloadType: %d, message:%@ size:%lu \n\n", uid, payloadType, string_message, (unsigned long)data.length);
    dispatch_async(dispatch_get_main_queue(), ^{
        NSString *showString = [NSString stringWithFormat:@" uid:%@\n payloadtype:%d message:%@\n size:%lu\n",
                                uid, payloadType, string_message, (unsigned long)data.length];
        _extendinfoL.stringValue = showString;
    });
    
}

Windows

public:
virtual void OnMediaExtensionMsgReceived(const char* uid, const int8_t * message, uint32_t size) override {
    /* TODO: Add your processing logic here based on your business requirements. */
}