O ARTC SDK oferece suporte ao envio e recebimento de mensagens SEI. Utilize este recurso para transmitir mensagens personalizadas do sistema RTC para o Alibaba Cloud CDN ou plataformas de transmissão ao vivo de terceiros.
Visão geral
Na codificação de vídeo, as informações suplementares de aprimoramento (SEI) fazem parte dos padrões H.264/AVC e H.265/HEVC. O SEI transporta dados adicionais junto com o conteúdo de vídeo para habilitar funções como sincronização de conteúdo e recuperação de erros. Casos de uso comuns incluem layouts de vídeo precisos, letras de músicas sincronizadas e questionários interativos ao vivo.
O método recomendado para enviar mensagens personalizadas é o SEI. Ele incorpora mensagens ao fluxo de vídeo para entrega a outros usuários no canal.
-
Benefícios:
Sincronização em tempo real: as mensagens são sincronizadas com o fluxo de vídeo.
Receptores ilimitados: qualquer usuário que assinar o fluxo pode receber as mensagens.
-
Limitações:
O tamanho máximo da mensagem é de 4 KB para evitar impactos no fluxo de vídeo.
Código de exemplo
A ARTC fornece projetos de exemplo open-source. Baixe ou visualize o código nos seguintes repositórios:
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.
Antes de começar
Certifique-se de atender aos seguintes requisitos:
Possuir uma conta Alibaba Cloud e ter criado um aplicativo ARTC (Criar um aplicativo ARTC). Obtenha o AppID e a AppKey no Console do ApsaraVideo Live.
Ter integrado o ARTC SDK (Integrar o ARTC SDK) e implementado chamadas básicas de áudio e vídeo (implementar recursos básicos de chamada de áudio e vídeo).
Implementação
Enviar uma mensagem SEI
Após publicar um fluxo de vídeo, chame a API sendMediaExtensionMsg para enviar dados SEI.
Referência da API
O ARTC SDK fornece duas APIs para enviar mensagens SEI.
|
API |
Descrição |
|
|
Parâmetros:
|
|
|
Estende |
Apenas uma mensagem de extensão de mídia pode estar em trânsito por vez. Chamadas subsequentes para sendMediaExtensionMsg sobrescrevem a mensagem anterior.
Exemplos
Os exemplos a seguir enviam uma string como mensagem SEI usando a 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);
Receber uma mensagem SEI
Após assinar um fluxo de vídeo, receba dados SEI registrando o callback apropriado.
Referência da API
|
Callback |
Descrição |
|
|
Acionado quando o SDK recebe uma mensagem SEI. Parâmetros:
|
Exemplos
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. */
}