一、需求

  在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. 剑指offer11(Java)-旋转数组中的最小值(简单)

    题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转.请返回旋转数 ...

  2. 力扣441(java&python)-排列硬币(简单)

    题目: 你总共有 n 枚硬币,并计划将它们按阶梯状排列.对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币.阶梯的最后一行 可能 是不完整的. 给你一个数字 n ,计算并返回可形成 完整 ...

  3. 基于WASM的无侵入式全链路A/B Test实践

    简介: 我们都知道,服务网格(ServiceMesh)可以为运行其上的微服务提供无侵入式的流量治理能力.通过配置VirtualService和DestinationRule,即可实现流量管理.超时重试 ...

  4. iOS App 启动优化

    ​简介: 作为程序猿来说,"性能优化"是我们都很熟悉的词,也是我们需要不断努⼒以及持续进⾏的事情:其实优化是⼀个很⼤的课题,因为细分来说的话有⼤⼤⼩⼩⼗⼏种优化⽅向 ,但是切忌在实 ...

  5. Dapr 在阿里云原生的实践

    简介: Faas 场景下,比较吸引用户的是成本和研发效率,成本主要通过按需分配和极致的弹性效率来达成.而应用开发者期望通过 FaaS 提供多语言的编程环境,提升研发效率,包括启动时间.发布时间.开发的 ...

  6. [FAQ] Sortable 拖拽组件, 火狐浏览器中打开新窗口问题

      Q:用了 sortable 组件,在火狐浏览器中进行拖拽时,会打开新窗口 ? Sortable组件地址,https://github.com/SortableJS/Sortable 当前处理方式 ...

  7. dotnet 给 NuGet 包加上 Aliases 别名解决类型冲突

    有时某个相同命名空间相同名字的类型被两个不同的 NuGet 包定义了,尽管这是非常少见的事情,咱需要使用到其中的一个 NuGet 包的类型,但默认情况下将会因为类型冲突而构建不通过.本文将告诉大家如何 ...

  8. dotnet C# 根据椭圆长度和宽度和旋转角计算出椭圆中心点的方法

    本文来告诉大家如何根据椭圆长度和宽度和旋转角计算出椭圆中心点的方法 方法很简单,请看代码 /// <summary> /// 辅助进行椭圆点计算的类 /// </summary> ...

  9. dotnet core 和 .NET 5 不支持 Prefer32Bit 首选 32 位的功能

    我尝试在 dotnet core 和 dotnet 5 的应用上,右击项目属性,在生成界面勾选首选 32 位的功能,然而在 x64 下没有生成 PE32+ 的应用 这是 .NET Core 以及以上版 ...

  10. Niginx中Vue Router 历史(history)模式的配置

    快速配置 将build后的文件直接丢到niginx目录下的html文件夹中,然后配置nginx.conf,就可以在快速的实现niginxhistory模式的配置了. location /{ # 可使用 ...