一、需求
在RTMP推送的流中添加一個接口,可以添加自定義的數據(一段字節數組)。
經過分析,在H264的流中可以通過SEI添加自定義數據,下面是實施的總結
二、實施
1)准備工具
RTMP推流客戶端
ffmpeg命令行工具
flvlib命令行分析工具
flvAnalyzer UI 分析工具
2)理論知識准備
RTMP中會將音頻視頻分開以Tag的方式打包發送,視頻的Tag的Payload中是H264的數據,Avcc格式,也就是每個NALU前面4個字節標記的是大小。
NALU在H264中的定義會有不同的類型,定義如下:
以上是NALU中常見的幀類型,sps、pps、vps、sei都是非音視頻內容數據幀
SEI數據是解碼非必須的數據,加強信息,存在的時候可以增強解碼幫助解碼器的容錯能力。
一個NALU開始的第一個字節標記這個NALU的類型是什么
開始碼:SEI的類型是 0x06 , 注意H265的類型是0x4E、0x01
自定義:SEI除了開始NALU類型之外,還存在不同的子類型,第二個字節(h265是第三個)0x05表示后續是自定義數據
負載長度:表示后續緊跟着的自定義數據的長度,計算方法是 n * FF + XY, 也就是將數據長度減去255,有多少個就寫多少個FF,剩下的如果不為0,再寫一個字節
負載內容:負載內容是UUID + payload content ,UUID 固定16個字節,用於區分不同的業務, payload content 表示自定義數據
注意:這里的負載內容因為可能存在 0x000001,0x000002,0x000003 與NALU的分隔符產生歧義,因此需要加入擾碼
那么計算的公式:
//H265 0x4E 0x01, FF(255)的個數*255+非FF值, 16 , userData, 0x80 //H264 0x06, FF(255)的個數*255+非FF值, 16 , userData, 0x80
3)代碼:
具體代碼,這里因為公司內部,就不貼了
4)效果
使用客戶端推流,然后使用ffmpeg錄制播放的流:
ffmpeg -i "rtmp url or http-flv url" -acodec copy -vcodec copy -f flv -y test.flv
使用debug-flv分析flv
可以看到第4個Tag是IDR幀,我們是將SEI數據打入I幀之前的,也就是SEI跟隨I幀。
使用UI工具查看
選中的就是SEI數據
三、參考資料
1)https://www.jianshu.com/p/4d9120dfcd69
2)https://www.jianshu.com/p/a8f9ee7754ec
3)https://depthlove.github.io/2015/11/13/flv-analysis-in-rtmp-live-play/
4)https://pypi.org/project/flvlib/