全部產品
Search
文件中心

ApsaraVideo Live:SEI的發送和接收

更新時間:Jan 22, 2026

ARTC SDK支援發送和接收SEI(Supplemental Enhancement Information)資訊。當您需要將自訂訊息從RTC系統傳輸到阿里雲CDN直播或第三方直播平台時,可以使用此功能來實現。

功能簡介

在視頻編碼領域,SEI(Supplemental Enhancement Information,補充增強資訊)是視頻編碼通訊協定(如 H.264/AVC 和 H.265/HEVC)中的一部分,用於傳輸與視頻內容相關的附加資訊。這些資訊為接收端提供協助工具功能,例如同步、錯誤恢複等,可用於視頻畫面的精準布局、遠端歌詞同步、直播答題等應用情境。

image

當開發人員需要發送自訂訊息時,推薦使用SEI。發送的自訂訊息會被附加在視頻資料流中,隨著視頻資料一起傳輸給房間裡的其他使用者。

  • 優點:

    • 即時性高,文本資訊和媒體流同步。

    • 接收方沒有人數限制,只要拉流就能收到。

  • 缺點:

    • 為了不影響視頻流傳輸,每條訊息目前最多可以傳遞 4K 位元組。

範例程式碼

ARTC 提供了開源樣本專案供您參考,您可以前往下載或查看其中的代碼,範例程式碼請參考:

Android端SEI發送和接收Android/ARTCExample/BasicUsage/src/main/java/com/aliyun/artc/api/basicusage/SEIUsage/SEIActivity.java

iOS端SEI發送和接收iOS/ARTCExample/BasicUsage/SEIUsage/SEIUsageVC.swift

Harmony端SEI發送和接收Harmony/ARTCExample/entry/src/main/ets/pages/basicusage/SEIPage.ets

前提條件

在實現 SEI 功能之前,請確保滿足以下要求:

功能實現

發送SEI訊息

使用者在啟動視頻推流後可以調用sendMediaExtensionMsg介面發送 SEI 資料。

介面資訊

ARTC SDK 提供兩個介面用於發送 SEI 訊息。

API 介面

描述

sendMediaExtensionMsg

參數:

  • message:媒體擴充資訊,長度限制為最大 4096 位元組。建議使用JSON或純字串。

  • repeatCount:重複次數,代表訊息冗餘度,用於防止網路丟包導致的訊息丟失,-1為無限傳輸。

  • delay:延遲,單位毫秒,調用API後,最短多少毫秒發送擴充資訊。

  • isKeyFrame: 是否只有主要畫面格才使用擴充資訊,true表示只有主要畫面格才附加擴充資訊。

sendMediaExtensionMsgEx

相比於 sendMediaExtensionMsg,額外提供payloadType 參數用於設定 SEI 資訊的類型,範圍: [5, 100..254],當payloadType=5等同於使用sendMediaExtensionMsg 介面。

說明

同一時間只有一條媒體擴充資訊在傳輸,多次調用sendMediaExtensionMsg,新調用的資料會覆蓋前一次的資料。

調用樣本

下面將以sendMediaExtensionMsgEx發送字串訊息為例示範 SEI 訊息的發送。

Android

// 前提已經加入頻道且推送視頻流(預設自動推送)
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

// 發送SEI訊息
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);
// 發送SEI訊息
this.rtcEngine.sendMediaExtensionMsg(seiData, 1, 0, false);

Windows

/* 客戶根據自己的業務填寫下面的參數 */
char * data = "xxxxx";
int length = strlen(data);
mAliRtcEngine->SendMediaExtensionMsg(data, length, 1,0,true);

接收SEI訊息

使用者訂閱房間內視頻流後,如果已經註冊 SEI 資料接收的回調,則可以接收當前房間的 SEI 資料。

介面資訊

回調介面

描述

onMediaExtensionMsgReceived

SEI訊息接收回調。

參數:

  • uid:發送該訊息的使用者識別碼。

  • payloadType:發生時SEI資訊的類型,sendMediaExtensionMsg返回5,sendMediaExtensionMsgEx發送的會返回具體類型。

  • message:收到的SEI訊息。

調用樣本

Android

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

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

iOS

extension SEIUsageMainVC: AliRtcEngineDelegate {
    
    // 收到SEI訊息回調
    // receive SEI message
    func onMediaExtensionMsgReceived(_ uid: String, payloadType: Int32, message data: Data) {
        // 處理訊息
        guard let message = String(data: data, encoding: .utf8) else {
            print("無法解析訊息")
            return
        }
        self.showToast(message: "Received SEI: \(message), from uid: \(uid), payloadType: \(payloadType)")
    }
    // 其他回調 ...

}

Harmony

// SEI訊息接收回調
listener.onMediaExtensionMsgReceived((uid: string, payloadType: number, message: ArrayBuffer) => {
  console.info(`收到SEI訊息: uid=${uid}, payloadType=${payloadType}, message=${message}`);
});

Windows

public:
virtual void OnMediaExtensionMsgReceived(const char* uid, const int8_t * message, uint32_t size) override {
    /* TODO:客戶根據自己的業務編寫處理邏輯 */
}