一、需求

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

RTMP推流FLV插入自定义SEI数据总结的更多相关文章

  1. 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)

    1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  2. 安卓平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结

    很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型 ...

  3. (转)RTMP中FLV流到标准h264、aac的转换

    这段时间,工作上的需要,在RTMP上做了flv流到标准h264.AAC的转换,服务器是开源项目CRTMPSERVER,客户端flex编写,视频编码h264,音频编码AAC,现将一些协议相关的东西记录如 ...

  4. EasyRTMP实现的rtmp推流的基本协议流程

    EasyRTMP介绍 EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer).智能丢帧.自动重连.rtmp协议等等多种技术,能够非 ...

  5. 命令行利用ffmpeg实现rtmp推流《转》

    ffmpeg在以前介绍过,是一个相当强大的工具,我们这次利用它实现rtmp推流(最终推流地址统一为rtmp://127.0.0.1:1935/live/123). 1.首先下载ffmpeg和ffpla ...

  6. 扩展 HtmlwebpackPlugin 插入自定义的脚本

    webpack提供了一个如何开发 webpack 插件的介绍,你可以直接访问这里查看,这里提供一个扩展 HtmlWebpackPlugin 的开发实例. 前面我们介绍过 HtmlWebpackPlug ...

  7. 写一个可插入自定义标签的 Textarea 组件

    - “插入自定义标签是什么鬼?” - “比如你要插入一个<wise></wise>的标签...” - “什么情况下会有这种需求?” - “得罪了产品的情况下...” 一.需求背 ...

  8. ffmpeg+EasyDSS流媒体服务器实现稳定的rtmp推流直播

    本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/74783269 需求 在做EasyDSS开发时,总 ...

  9. rtmp 推送h264 + aac 的数据

    相关源码下载: http://download.csdn.net/detail/keepingstudying/8340431 需要libfaac,librtmp 的支持, 1.帧的划分 1.1 H. ...

  10. 7.Vue-Quill-Editor图片插入自定义

    Vue-Quill-Editor图片插入自定义 前言: 因为在项目中前端采用了Vue来实现,正好用到了富文本编辑器这一块,于是,经过技术上的选择,决定使用Vue-Quill-Editor. 使用的过程 ...

随机推荐

  1. 实战:如何编写一个 OpenTelemetry Extensions

    前言 前段时间我们从 SkyWalking 切换到了 OpenTelemetry ,与此同时之前使用 SkyWalking 编写的插件也得转移到 OpenTelemetry 体系下. 我也写了相关介绍 ...

  2. ImageJ软件使用教程(三):目标计数

    目录 多点工具法 阀值分割法 二值化 填充分割 自动计数 显示结果 总结 参考资料 本文以钢筋计数为例,讲解一下如何使用ImageJ软件进行计数,这里只介绍两种方法: 多点工具法 阀值分割法 钢筋计数 ...

  3. drf——基于apiview写过滤、排序和分页

    基于APIView带过滤和排序 from rest_framework.views import APIView from .models import Book from .serializer i ...

  4. Java实现银行存取款

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" 代码 `` ...

  5. Oracle sql 月份的加减以及差值

    Oracle sql 月份的加减以及差值 差值 使用months_between,输出的是两个日期的差值 select months_between(TO_DATE('2022-05-31','yyy ...

  6. SVN Windows10的安装

    SVN Windows安装与配置 先去到官网的下载链接:Download Apache Subversion Sources 然后点这个 binary packages 在这里能看到大多数的操作系统的 ...

  7. 力扣258(java)-各位相加(简单)

    题目: 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数.返回这个结果. 示例 1: 输入: num = 38输出: 2 解释: 各位相加的过程为:38 --> 3 + 8 ...

  8. 数据库PolarDB开源之路该如何走?听听他们怎么说

    简介: 10月25日,由阿里云开发者社区.阿里云PolarDB开源社区.InfoQ联合举办的「开源人说」数据库PolarDB专场线下沙龙在杭州召开,5位阿里云数据库超级大咖.10位阿里云数据库开源生态 ...

  9. 从 VLAN 到 IPVLAN: 聊聊虚拟网络设备及其在云原生中的应用

    简介: 由于这篇文章真的很长,大量的篇幅在讲述内核的实现,如果你对这部分不感兴趣,那么在建议你在看完第一部分的三个问题后,思考一下,然后直接跳转到我们对问题的回答. 作者:张伟(谢石)   由于这篇文 ...

  10. [FE] 实时视频流库 hls.js 重载切换资源的方式

    hls 播放需要先 attachMedia,然后 loadSource. 如果切换 resource,需要先执行 hls.destroy(),否则会出现混乱. destroy 之后再依次进行 hls ...