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/
RTMP推流FLV插入自定义SEI数据总结的更多相关文章
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
1.listview入门,自定义的数据适配器 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/and ...
- 安卓平台RTMP推流或轻量级RTSP服务(摄像头或同屏)编码前数据接入类型总结
很多开发者在做Android平台RTMP推流或轻量级RTSP服务(摄像头或同屏)时,总感觉接口不够用,以大牛直播SDK为例 (Github) 我们来总结下,我们常规需要支持的编码前音视频数据有哪些类型 ...
- (转)RTMP中FLV流到标准h264、aac的转换
这段时间,工作上的需要,在RTMP上做了flv流到标准h264.AAC的转换,服务器是开源项目CRTMPSERVER,客户端flex编写,视频编码h264,音频编码AAC,现将一些协议相关的东西记录如 ...
- EasyRTMP实现的rtmp推流的基本协议流程
EasyRTMP介绍 EasyRTMP是结合了多种音视频缓存及网络技术的一个rtmp直播推流端,包括:圆形缓冲区(circular buffer).智能丢帧.自动重连.rtmp协议等等多种技术,能够非 ...
- 命令行利用ffmpeg实现rtmp推流《转》
ffmpeg在以前介绍过,是一个相当强大的工具,我们这次利用它实现rtmp推流(最终推流地址统一为rtmp://127.0.0.1:1935/live/123). 1.首先下载ffmpeg和ffpla ...
- 扩展 HtmlwebpackPlugin 插入自定义的脚本
webpack提供了一个如何开发 webpack 插件的介绍,你可以直接访问这里查看,这里提供一个扩展 HtmlWebpackPlugin 的开发实例. 前面我们介绍过 HtmlWebpackPlug ...
- 写一个可插入自定义标签的 Textarea 组件
- “插入自定义标签是什么鬼?” - “比如你要插入一个<wise></wise>的标签...” - “什么情况下会有这种需求?” - “得罪了产品的情况下...” 一.需求背 ...
- ffmpeg+EasyDSS流媒体服务器实现稳定的rtmp推流直播
本文转自EasyDarwin团队成员Alex的博客:http://blog.csdn.net/cai6811376/article/details/74783269 需求 在做EasyDSS开发时,总 ...
- rtmp 推送h264 + aac 的数据
相关源码下载: http://download.csdn.net/detail/keepingstudying/8340431 需要libfaac,librtmp 的支持, 1.帧的划分 1.1 H. ...
- 7.Vue-Quill-Editor图片插入自定义
Vue-Quill-Editor图片插入自定义 前言: 因为在项目中前端采用了Vue来实现,正好用到了富文本编辑器这一块,于是,经过技术上的选择,决定使用Vue-Quill-Editor. 使用的过程 ...
随机推荐
- docker 应用篇————容器卷[十一]
前言 简单介绍一下容器卷. 正文 我们发现一个文件,就是什么呢? 就是说因为我们的容器一但删除那么什么都没有了. 那么如何能够不删除呢?那么可以使用容器卷. 比如说系统我们容器内的/usr 使用我们的 ...
- 重新整理数据结构与算法(c#)—— 二叉树排序树[二十二]
前言 什么是二叉堆排序呢? 就是上面这种,一个节点大于左节点,但是小于右节点,再我写的例子中会写出大于等于右节点. 那么如何让一个数组进行变成这种二叉树呢? 其实只要有规律就很简单. 第一个元素(0) ...
- 一周涨 15k Star 的开源项目「GitHub 热点速览」
你训练大语言模型(LLM)用的什么框架?有没有想过不用框架训练 GPT-2? GitHub 上就有这么一位大神(Andrej Karpathy),他仅用大约 1k 行的 C 代码就完成了 GPT-2 ...
- 【进阶篇】Java 实际开发中积累的几个小技巧(二)
目录 前言 六.自定义注解 6.1定义注解 6.2切面实现 6.3业务使用 七.抽象类和接口 7.1隔离业务层与 ORM 层 7.2隔离子系统的业务实现 7.3选择对比 文章小结 前言 笔者目前从事一 ...
- .NET开源强大、易于使用的缓存框架 - FusionCache
前言 缓存在程序中扮演着提升性能.降低资源消耗.改善用户体验等重要角色,是构建高效.可伸缩.稳定的系统不可或缺的重要组成部分.今天大姚给大家分享一款.NET开源(基于MIT license).强大.易 ...
- 对于小程序canvas在某些情况下touchmove 不能触发导致的签名不连续替代方案(企微)
1.问题 微信开放社区链接 尝试过新版canvas,在企业微信中签名依然是依然断触,有问题的手机是iphoe15,系统版本以及企微版本微信版本均与签名正常的手机一致,但是那个手机就是无法正常签字,在微 ...
- 力扣32(java)-最长有效括号(困难)
题目: 给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度. 示例 1: 输入:s = "(()"输出:2解释:最长有效括号子串是 &quo ...
- 从 2018 年 Nacos 开源说起
2018 年夏天 国内微服务开源 领域,迎来了一位新成员.此后,在构建微服务注册中心和配置中心的过程中,国内开发者多了一个可信赖的选项. Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务 ...
- 慢SQL治理分享
简介: 这里的慢SQL指的是MySQL慢查询,是运行时间超过long_query_time值的SQL.真实的慢SQL通常会伴随着大量的行扫描.临时文件排序或者频繁的磁盘flush,直接影响就是磁盘IO ...
- [Go] 选择 Beego 的三个理由
1. 项目支持角度较其它框架考虑的多一些,比如:目录结构的简单约定,内置项目配置读取,内置bee脚手架,热重载特性 等. (实际这些 feature 都可以找到 golang 专精的组件引入起来,效果 ...