Todos os produtos
Search
Central de documentação

ApsaraVideo Live:Enviar e receber mensagens SEI

Última atualização: Jun 30, 2026

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.

image

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:

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

sendMediaExtensionMsg

Parâmetros:

  • message: a mensagem de extensão de mídia. Tamanho máximo: 4.096 bytes. Use formato JSON ou string simples.

  • repeatCount: o número de vezes para repetir a mensagem visando redundância contra perda de pacotes. Um valor de -1 envia a mensagem indefinidamente.

  • delay: o atraso em milissegundos entre a chamada da API e o envio da mensagem.

  • isKeyFrame: especifica se a mensagem deve ser anexada apenas a um keyframe.

sendMediaExtensionMsgEx

Estende sendMediaExtensionMsg com um parâmetro payloadType para o tipo de mensagem SEI. Valores válidos: 5 ou 100-254. Definir payloadType=5 equivale a chamar sendMediaExtensionMsg.

Nota

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

onMediaExtensionMsgReceived

Acionado quando o SDK recebe uma mensagem SEI.

Parâmetros:

  • uid: o ID do usuário que enviou a mensagem.

  • payloadType: o tipo da mensagem SEI. O valor é 5 para mensagens enviadas por sendMediaExtensionMsg. Para sendMediaExtensionMsgEx, o valor corresponde ao tipo especificado.

  • message: a mensagem SEI recebida.

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. */
}