如何在RTSP/RTMP直播过程中加入SEI扩展数据发送和接收解析
在直播系統(tǒng)中,除了直播音視頻之外,有時候還想從主播端發(fā)布文本信息等,這些信息可以不通過視頻傳輸通道發(fā)送給用戶播放端,但如果傳輸?shù)臄?shù)據(jù)想和視頻保持精準同步,那最好的辦法就是這些信息和視頻數(shù)據(jù)打包在一起傳輸,并通過h264 sei方式就可以把數(shù)據(jù)放入h264 Access Unit中傳輸。
擴展SEI有使用場景:
1、公告廣播:推送將相對/絕對時間戳/時間/公告內(nèi)容發(fā)到播放端,播放端實時接收消息并做相應的邏輯處理;
2、沖頂大會:推流端實時將題目分發(fā)到播放端,借助于大牛直播SDK低延遲特性,輕松實現(xiàn)“音-畫-題”同步接收;
3、直播:推流端將歌詞/字幕分發(fā)到播放端,播放端實時繪制出歌詞;
4、應急指揮/單兵:推送端將GIS信息/現(xiàn)場采集到的數(shù)據(jù)實時寫入并分發(fā)到播放端;
5、在線教育:推流端將激光筆和涂鴉操作分發(fā)到播放端,播放端實時劃圈劃線,實現(xiàn)特定特效。
擴展SEI調(diào)用demo(以Windows平臺為例):
?1. 啟動推送端軟件:?SmartPublisherDemo.exe,可到?Github?下載大牛直播SDK的相關(guān)測試軟件或demo源碼。
?2. 做如下配置:
3. 可以點擊自動發(fā)送文本按鈕;
4. 打開播放端SmartPlayer.exe查看數(shù)據(jù)傳輸播放效果:
擴展SEI調(diào)用demo代碼說明:
1. 推送端(對應工程:WIN-PublisherSDK-CPP-Demo):
/*++++發(fā)送用戶自定義數(shù)據(jù)相關(guān)接口++++*//** 1. 目前使用sei機制發(fā)送用戶自定數(shù)據(jù)到播放端* 2. 這種機制有可能會丟失數(shù)據(jù), 所以這種方式不保證接收端一定能收到* 3. 優(yōu)勢:能和視頻保持同步,雖然有可能丟失,但一般的需求都滿足了* 4. 目前提供兩種發(fā)送方式 第一種發(fā)送二進制數(shù)據(jù), 第二種發(fā)送 utf8字符串*//** 設置發(fā)送隊列大小,為保證實時性,默認大小為3, 必須設置一個大于0的數(shù)* 如果數(shù)據(jù)超過隊列大小,將丟掉隊頭數(shù)據(jù)* 這個接口請在 StartPublisher 之前調(diào)用*/NT_UINT32(NT_API *SetPostUserDataQueueMaxSize)(NT_HANDLE handle, NT_INT32 max_size, NT_INT32 reserve);/** 清空用戶數(shù)據(jù)隊列, 有些情況可能會用到,比如發(fā)送隊列里面有4條消息再等待發(fā)送,又想把最新的消息快速發(fā)出去, 可以 * 先清除掉正在排隊消息, 再調(diào)用PostUserXXX **/NT_UINT32(NT_API *ClearPostUserDataQueue)(NT_HANDLE handle);/** 發(fā)送二進制數(shù)據(jù)* data: 二進制數(shù)據(jù)* size:數(shù)據(jù)大小* 注意: 1.目前數(shù)據(jù)大小限制在256個字節(jié)以內(nèi),太大可能會影響視頻傳輸,如果有特殊需求,需要增大限制,請聯(lián)系我們* 2. 如果積累的數(shù)據(jù)超過了設置的隊列大小,之前的隊頭數(shù)據(jù)將被丟棄* 3. 必須再調(diào)用StartPublisher之后再發(fā)送數(shù)據(jù)*/NT_UINT32(NT_API *PostUserData)(NT_HANDLE handle, const NT_BYTE* data, NT_UINT32 size, NT_INT32 reserve);/** 發(fā)送utf8字符串* utf8_str: utf8字符串* 注意: 1. 字符串長度不能超過256, 太大可能會影響視頻傳輸,如果有特殊需求,需要增大限制,請聯(lián)系我們* 2. 如果積累的數(shù)據(jù)超過了設置的隊列大小,之前的隊頭數(shù)據(jù)將被丟棄* 3. 必須再調(diào)用StartPublisher之后再發(fā)送數(shù)據(jù)*/NT_UINT32(NT_API *PostUserUTF8StringData)(NT_HANDLE handle, NT_PCSTR utf8_str, NT_INT32 reserve);/*----發(fā)送用戶自定義數(shù)據(jù)相關(guān)接口----*/2. 播放端(對應工程:WIN-PlayerSDK-CPP-Demo):
/*設置用戶數(shù)據(jù)回調(diào)*/NT_UINT32(NT_API *SetUserDataCallBack)(NT_HANDLE handle,NT_PVOID call_back_data, NT_SP_SDKUserDataCallBack call_back);/*設置視頻sei數(shù)據(jù)回調(diào)*/NT_UINT32(NT_API *SetSEIDataCallBack)(NT_HANDLE handle,NT_PVOID call_back_data, NT_SP_SDKSEIDataCallBack call_back); /* * * 用戶數(shù)據(jù)回調(diào),目前是推送端發(fā)送過來的 * data_type: 數(shù)據(jù)類型,1:表示二進制字節(jié)類型. 2:表示utf8字符串 * data:實際數(shù)據(jù), 如果data_type是1的話,data類型是const NT_BYTE*, 如果data_type是2的話,data類型是 const NT_CHAR* * size: 數(shù)據(jù)大小 * 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數(shù)據(jù)回調(diào) * data: sei 數(shù)據(jù) * size: sei 數(shù)據(jù)大小 * timestamp:視頻時間戳 * reserve1: 保留 * reserve2: 保留 * reserve3: 保留 * 注意: 目前測試發(fā)現(xiàn)有些視頻有好幾個sei nal, 為了方便用戶處理,我們把解析到的所有sei都吐出來,sei nal之間還是用 00 00 00 01 分隔, 這樣方便解析 * 吐出來的sei數(shù)據(jù)目前加了 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優(yōu)勢
1. 不依賴于相關(guān)協(xié)議,rtsp和rtmp都可以,其他協(xié)議只要播放端支持SEI解析的都可以使用;
2.? 兼容性很好,如果播放端不支持自定義SEI數(shù)據(jù)解析,把SEI數(shù)據(jù)丟給H264解碼器,解碼器只是忽略掉,并不影響正常播放,上述操作也可以用VLC來播放,播放正常,只是不顯示SEI消息;
3. 在視頻幀攜帶,完全和視頻保持同步,這個是其他傳輸通道無法做到的。
總結(jié)
以上是生活随笔為你收集整理的如何在RTSP/RTMP直播过程中加入SEI扩展数据发送和接收解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python】app未注册用户自动筛选
- 下一篇: 理论加实践,终于把时间序列预测ARIMA