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.
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 :
Vous disposez d'un compte Alibaba Cloud et avez créé une application ARTC (Créer une application ARTC). Obtenez l'AppID et l'AppKey depuis la console ApsaraVideo Live.
Vous avez intégré le SDK ARTC (Intégrer le SDK ARTC) et implémenté les appels audio et vidéo de base (implémenter les fonctionnalités d'appel audio et vidéo de base).
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 |
|
|
Paramètres :
|
|
|
Étend |
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 |
|
|
Déclenché lorsque le SDK reçoit un message SEI. Paramètres :
|
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. */
}