1 SEI功能簡介
在音視頻流媒體應用中,除了可以流媒體通道推拉音視頻內容外,還可以使用流 SEI(Supplemental Enhancement Information,媒體補充增強資訊)通過流媒體通道將文本資訊與音視頻內容打包在一起,從主播端(推流端)推出,并從觀眾端(拉流端)接收,以此實作文本資料與音視頻內容的精準同步的目的,
一般可用于視頻畫面的精準布局、遠端歌詞同步、直播答題等應用場景,
SEI 的相關概念及原理請參考 如何理解和使用 SEI(媒體補充增強資訊),
適合對訊息發送有較高頻率和實時性要求,且訊息丟失不會影響業務邏輯時,推薦使用 SEI(Supplemental Enhancement Information,媒體補充增強資訊),
2 SEI示例原始碼下載
請參考 下載示例原始碼 獲取原始碼,
相關原始碼請查看 “/ZegoExpressExample/Examples/Others/SupplementalEnhancementInformation” 目錄下的檔案,
3 實作SEI之前的前提條件
在實作 SEI 功能之前,請確保:
- 已在專案中集成 ZEGO Express SDK,實作基本的實時音視頻功能,詳情請參考 快速開始 - 集成 和 快速開始 - 實作視頻通話,
- 已在 ZEGO 控制臺 創建專案,并申請有效的 AppID 和 AppSign,詳情請參考 控制臺 - 專案管理 中的“專案資訊”,
4 SEI介面使用步驟
發送與接收 SEI 資訊功能需要推流和拉流端配對使用才能展示效果,即需要在推流端發送 SEI 資訊,拉流端接收 SEI 資訊,以下內容將介紹各端如何使用發送與接收 SEI 資訊功能,

主播推流發送 SEI 訊息呼叫流程如下:
-
呼叫
createEngine介面創建 engine 物件, -
呼叫
loginRoom介面登錄房間, -
呼叫
startPublishingStream介面推流, -
在推流成功后,呼叫
sendSEI介面發送 SEI 資訊,
觀眾拉流接收 SEI 訊息呼叫流程如下:
-
呼叫
createEngine介面創建 engine 物件, -
創建
IZegoEventHandler物件,并重寫接收 SEI 資訊的onPlayerRecvSEI方法,呼叫setEventHandler介面傳入創建的IZegoEventHandler監聽onPlayerRecvSEI的回呼, -
呼叫
loginRoom介面登錄房間, -
呼叫
startPlayingStream介面拉流, -
在拉流成功后,接收到推流端發送的 SEI 資訊之后觸發
onPlayerRecvSEI回呼,拉流時,如果開發者通過呼叫
mutePlayStreamVideo或muteAllPlayStreamVideo介面,設定了只拉音頻流時,將無法接收 SEI 資訊,
4.1 (可選)設定 SEI 型別
設定 SEI 型別
由于 SDK 默認使用 ZEGO 自行定義的 SEI(nalu type = 6, payload type = 243)型別打包,且此型別是 SEI 標準未規定的型別,因此跟視頻編碼器或者視頻檔案中的 SEI 不存在沖突,但當開發者需要使用第三方解碼器解碼時(如 FFmpeg),會導致解不出正確的 SEI,此時需要在推流前呼叫 setSEIConfig 介面更換 SDK 發送 SEI 的型別,使用 UserUnregister 的 SEI(nalu type = 6, payload type = 5)型別打包,
僅當開發者使用第三方解碼器解碼 SEI 時需要執行該步驟,
-
介面原型
/** * 設定媒體增強補充資訊(SEI)型別 * * 必須在推流之前設定, * * @param config SEI 配置屬性,默認使用 ZEGO 定義的 SEI 型別, */ public void setSEIConfig(ZegoSEIConfig config); -
呼叫示例
ZegoSEIConfig seiConfig = new ZegoSEIConfig(); // 采用 H.264 的 SEI (nalu type = 6,payload type = 5) 型別打包,因為視頻編碼器自身會產生 payload type 為 5 的 SEI,或者使用視頻檔案推流時,視頻檔案中也可能存在這樣的 SEI,所以使用此型別時,用戶需要把 uuid + content 當作 buffer 塞給 SEI 發送介面;此時為了區別視頻編碼器自身產生的 SEI, App 在發送此型別 SEI 時,可以填寫業務特定的 uuid(uuid長度為16位元組),接收方使用 SDK 決議 payload type 為 5 的 SEI 時,會根據設定的過濾字串過濾出 uuid 相符的 SEI 拋給業務,如果沒有設定過濾字串,SDK 會把所有收到的 SEI 都拋給開發者,
seiConfig.type = ZegoSEIType.USER_UNREGISTER;
engine.setSEIConfig(seiConfig);
// 通過 advancedConfig 設定 uuid 過濾欄位,設定之后 SDK 只會拋出前 12 個位元組為開發者所設定 uuid 的 SEI
ZegoEngineConfig engineConfig = new ZegoEngineConfig();
// 其他用戶通過 [onPlayerRecvSEI] 收到的 SEI 資訊前 12 個位元組一定是 zegozegozego,其他會被過濾
engineConfig.advancedConfig.put("unregister_sei_filter", "zegozegozego");
ZegoExpressEngine.setEngineConfig(engineConfig);
// 開始推流
engine.startPublishingStream("STREAM_ID");
```
4.2 直播推流方
發送 SEI 資訊的介面需要在推流成功之后呼叫,介面原型如下:
-
介面原型
/** * 發送媒體增強補充資訊 * * 此介面可在開發者推流傳輸音視頻流資料同時,發送流媒體增強補充資訊來同步一些其他附加資訊, * 一般如同步音樂歌詞或視頻畫面精準布局等場景,可選擇使用發送 SEI, * 當推流方發送 SEI 后,拉流方可通過監聽 [onPlayerRecvSEI] 的回呼獲取 SEI 內容, * 由于 SEI 資訊跟隨視頻幀或音頻幀,由于網路問題有可能丟幀,因此 SEI 資訊也有可能丟,為解決這種情況,應該在限制頻率內多發幾次, * 限制頻率:1秒鐘不要超過30次, * SEI 資料長度限制為 4096 位元組, * @param data SEI 內容 */ public void sendSEI(byte[] data) -
呼叫示例
/** 定義 SDK 引擎物件 */ ZegoExpressEngine engine; ZegoEngineProfile profile = new ZegoEngineProfile(); /** 請通過官網注冊獲取,格式為 123456789L */ profile.appID = appID; /** 請通過官網注冊獲取,格式為:@"0123456789012345678901234567890123456789012345678901234567890123"(共64個字符)*/ profile.appSign = appSign; /** 通用場景接入 */ profile.scenario = ZegoScenario.GENERAL; /** 設定app的application 物件 */ profile.application = getApplication(); /** 創建引擎 */ engine = ZegoExpressEngine.createEngine(profile, null); // 登錄房間 engine.loginRoom("roomid", new ZegoUser("userid_1")); // 推流 engine.startPublishingStream("streamid"); // 開發者的其他業務邏輯 ...; // 在業務場景需要的時機發送 SEI 資訊 engine.sendSEI("12345".getBytes());
4.3 直播拉流方
接收 SEI 資訊的回呼介面需要在拉流成功之后觸發,介面原型如下:
-
介面原型
/** * 收到遠端流的 SEI 內容 * * 拉流成功后,當遠端流呼叫 sendSEI 后,本端會收到此回呼, * 若只拉純音頻流,將收不到推流端發送的 SEI 資訊, * @param streamID 拉流的流 ID * @param data SEI 內容 */ public void onPlayerRecvSEI(String streamID, byte[] data){ } -
呼叫示例
/** 定義 SDK 引擎物件 */ ZegoExpressEngine engine; ZegoEngineProfile profile = new ZegoEngineProfile(); /** 請通過官網注冊獲取,格式為 123456789L */ profile.appID = appID; /** 請通過官網注冊獲取,格式為:@"0123456789012345678901234567890123456789012345678901234567890123"(共64個字符)*/ profile.appSign = appSign; /** 通用場景接入 */ profile.scenario = ZegoScenario.GENERAL; /** 設定app的application 物件 */ profile.application = getApplication(); /** 創建引擎 */ engine = ZegoExpressEngine.createEngine(profile, null); // 創建 IZegoEventHandler 物件, 并重寫 onPlayerRecvSEI 方法 IZegoEventHandler handler = new IZegoEventHandler(){ // 監聽其他回呼 ...; // 監聽接收 SEI 資訊的回呼, 當發送端呼叫 sendSEI 發送資訊時會觸發此回呼 public void onPlayerRecvSEI(String streamID, byte[] data) { // 在這里實作業務場景相關的邏輯, 例如展現相關的UI等 ...; } } // 添加監聽的回呼物件 engine.setEventHandler(handler); // 登錄房間 engine.loginRoom("roomid", new ZegoUser("userid_2")); // 拉流, canvas 為 ZegoCanvas 型別的索引 UI 渲染控制元件的物件 engine.startPlayingStream("streamid", canvas); // 開發者的其他業務邏輯 ...;
5 獲取 SEI更多幫助
獲取本文SEI(Supplemental Enhancement Information,媒體補充增強資訊)的開發檔案、技術支持,訪問即構檔案中心開發檔案頁,適合對訊息發送有較高頻率和實時性要求,且訊息丟失不會影響業務邏輯的開發場景,例直播答題、歌詞同步、單流自定義音浪,混流視頻畫面布局更換的精準控制,
近期有開發規劃的開發者可上即構官網查看,恰逢即構七周年全線音視頻產品1折的優惠,聯系商務獲取產品優惠;
音視頻場景解決方案分享,更多詳情可搜索官網(https://zegoguanwang.datasink.sensorsdata.cn/t/pB)轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/518512.html
標籤:其他
上一篇:上架App Store的整體流程
