RTMP推流FLV插入自定義SEI數據總結


一、需求

  在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/  


免責聲明!

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



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