ARTC SDK支援發送和接收SEI(Supplemental Enhancement Information)資訊。當您需要將自訂訊息從RTC系統傳輸到阿里雲CDN直播或第三方直播平台時,可以使用此功能來實現。
功能簡介
在視頻編碼領域,SEI(Supplemental Enhancement Information,補充增強資訊)是視頻編碼通訊協定(如 H.264/AVC 和 H.265/HEVC)中的一部分,用於傳輸與視頻內容相關的附加資訊。這些資訊為接收端提供協助工具功能,例如同步、錯誤恢複等,可用於視頻畫面的精準布局、遠端歌詞同步、直播答題等應用情境。
當開發人員需要發送自訂訊息時,推薦使用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,新調用的資料會覆蓋前一次的資料。
調用樣本
下面將以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 資料。
介面資訊
回調介面 | 描述 |
| 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:客戶根據自己的業務編寫處理邏輯 */
}