如何在RTSP/RTMP直播過程中加入SEI擴展數據發送和接收解析


在直播系統中,除了直播音視頻之外,有時候還想從主播端發布文本信息等,這些信息可以不通過視頻傳輸通道發送給用戶播放端,但如果傳輸的數據想和視頻保持精准同步,那最好的辦法就是這些信息和視頻數據打包在一起傳輸,並通過h264 sei方式就可以把數據放入h264 Access Unit中傳輸。

擴展SEI有使用場景:

1、公告廣播:推送將相對/絕對時間戳/時間/公告內容發到播放端,播放端實時接收消息並做相應的邏輯處理;

2、沖頂大會:推流端實時將題目分發到播放端,借助於大牛直播SDK低延遲特性,輕松實現“音-畫-題”同步接收;

3、直播:推流端將歌詞/字幕分發到播放端,播放端實時繪制出歌詞;

4、應急指揮/單兵:推送端將GIS信息/現場采集到的數據實時寫入並分發到播放端;

5、在線教育:推流端將激光筆塗鴉操作分發到播放端,播放端實時划圈划線,實現特定特效。

擴展SEI調用demo(以Windows平台為例):

 1. 啟動推送端軟件: SmartPublisherDemo.exe,可到 Github 下載大牛直播SDK的相關測試軟件或demo源碼。

 2. 做如下配置:

3. 可以點擊自動發送文本按鈕;

4. 打開播放端SmartPlayer.exe查看數據傳輸播放效果:

擴展SEI調用demo代碼說明:

1. 推送端(對應工程:WIN-PublisherSDK-CPP-Demo):

		/*++++發送用戶自定義數據相關接口++++*/ /* * 1. 目前使用sei機制發送用戶自定數據到播放端 * 2. 這種機制有可能會丟失數據, 所以這種方式不保證接收端一定能收到 * 3. 優勢:能和視頻保持同步,雖然有可能丟失,但一般的需求都滿足了 * 4. 目前提供兩種發送方式 第一種發送二進制數據, 第二種發送 utf8字符串 */ /* * 設置發送隊列大小,為保證實時性,默認大小為3, 必須設置一個大於0的數 * 如果數據超過隊列大小,將丟掉隊頭數據 * 這個接口請在 StartPublisher 之前調用 */ NT_UINT32(NT_API *SetPostUserDataQueueMaxSize)(NT_HANDLE handle, NT_INT32 max_size, NT_INT32 reserve); /* * 清空用戶數據隊列, 有些情況可能會用到,比如發送隊列里面有4條消息再等待發送,又想把最新的消息快速發出去, 可以 * 先清除掉正在排隊消息, 再調用PostUserXXX * */ NT_UINT32(NT_API *ClearPostUserDataQueue)(NT_HANDLE handle); /* * 發送二進制數據 * data: 二進制數據 * size:數據大小 * 注意: 1.目前數據大小限制在256個字節以內,太大可能會影響視頻傳輸,如果有特殊需求,需要增大限制,請聯系我們 * 2. 如果積累的數據超過了設置的隊列大小,之前的隊頭數據將被丟棄 * 3. 必須再調用StartPublisher之后再發送數據 */ NT_UINT32(NT_API *PostUserData)(NT_HANDLE handle, const NT_BYTE* data, NT_UINT32 size, NT_INT32 reserve); /* * 發送utf8字符串 * utf8_str: utf8字符串 * 注意: 1. 字符串長度不能超過256, 太大可能會影響視頻傳輸,如果有特殊需求,需要增大限制,請聯系我們 * 2. 如果積累的數據超過了設置的隊列大小,之前的隊頭數據將被丟棄 * 3. 必須再調用StartPublisher之后再發送數據 */ NT_UINT32(NT_API *PostUserUTF8StringData)(NT_HANDLE handle, NT_PCSTR utf8_str, NT_INT32 reserve); /*----發送用戶自定義數據相關接口----*/

2. 播放端(對應工程:WIN-PlayerSDK-CPP-Demo):

		/* 設置用戶數據回調 */ NT_UINT32(NT_API *SetUserDataCallBack)(NT_HANDLE handle, NT_PVOID call_back_data, NT_SP_SDKUserDataCallBack call_back); /* 設置視頻sei數據回調 */ NT_UINT32(NT_API *SetSEIDataCallBack)(NT_HANDLE handle, NT_PVOID call_back_data, NT_SP_SDKSEIDataCallBack call_back);
/* * * 用戶數據回調,目前是推送端發送過來的 * data_type: 數據類型,1:表示二進制字節類型. 2:表示utf8字符串 * data:實際數據, 如果data_type是1的話,data類型是const NT_BYTE*, 如果data_type是2的話,data類型是 const NT_CHAR* * size: 數據大小 * timestamp: 視頻時間戳 * reserve1: 保留 * reserve2: 保留 * reserve3: 保留 */ typedef NT_VOID(NT_CALLBACK* NT_SP_SDKUserDataCallBack)(NT_HANDLE handle, NT_PVOID user_data, NT_INT32 data_type, NT_PVOID data, NT_UINT32 size, NT_UINT64 timestamp, NT_UINT64 reserve1, NT_INT64 reserve2, NT_PVOID reserve3 ); /* * * 視頻的sei數據回調 * data: sei 數據 * size: sei 數據大小 * timestamp:視頻時間戳 * reserve1: 保留 * reserve2: 保留 * reserve3: 保留 * 注意: 目前測試發現有些視頻有好幾個sei nal, 為了方便用戶處理,我們把解析到的所有sei都吐出來,sei nal之間還是用 00 00 00 01 分隔, 這樣方便解析 * 吐出來的sei數據目前加了 00 00 00 01 前綴 */ typedef NT_VOID(NT_CALLBACK* NT_SP_SDKSEIDataCallBack)(NT_HANDLE handle, NT_PVOID user_data, NT_BYTE* data, NT_UINT32 size, NT_UINT64 timestamp, NT_UINT64 reserve1, NT_INT64 reserve2, NT_PVOID reserve3 );

SEI優勢

1. 不依賴於相關協議,rtsp和rtmp都可以,其他協議只要播放端支持SEI解析的都可以使用;

2.  兼容性很好,如果播放端不支持自定義SEI數據解析,把SEI數據丟給H264解碼器,解碼器只是忽略掉,並不影響正常播放,上述操作也可以用VLC來播放,播放正常,只是不顯示SEI消息;

3. 在視頻幀攜帶,完全和視頻保持同步,這個是其他傳輸通道無法做到的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM