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/  

posted @ 2018-09-19 18:57  兜兜有糖的博客  阅读(4574)  评论(0编辑  收藏  举报