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. 使用的过程 ...
随机推荐
- Excel 特殊分组汇总示例
期望结果: 按照成绩划分区间段来分组时,定义好值的划分区间后,只需用 pseg 函数便可以将分数分好段,然后统计出各段人次即可. SPL 代码如下: A B 1 =clipboard().impo ...
- js es6 介绍set,WeakSet
前言 介绍一下es6 的set 和 weakset 正文 set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set ...
- 物联网浏览器(IoTBrowser)-使用深度学习开发防浸水远程报警
一.起因 新房子买在2楼,反水概率较大,加上无良开发商的劣质材料,就我所在楼栋已经发生几起反水事件,而且是高层反水,有几户重复出现反水,原因是管道中间有一个钢筋 :( 二.解决方案 1.水浸传感器+W ...
- 一文读懂 BizDevOps:数字化转型下的技术破局
简介: 目标.方法与实践. 我们正迈向数字经济时代,数字化转型成为普遍行动.未来绝大多数业务都将运行在数字基座之上,软件系统成为业务创新和发展的核心引擎.在这一趋势下,产品研发的交付能力面临巨大挑战, ...
- 免费体验!阿里云智能LOGO帮你解决设计难题
简介:超实用!零基础搞定一个高大上的智能logo设计 新年过后,往往是大家一年中士气最足的时候,散去了年末的疲惫和emo,重燃对新一年的热情和希望. 想创业的朋友们同样意气风发,趁着新年的劲头想大干 ...
- [Gse] 高效的Golang中文分析库推荐
优点:用法简单,支持各种语言,基本满足需求. 缺点:默认分词字典文件有 8M 需测试使用速度. 我们可以直接封装一个简单的辅助方法来实现分词功能: // @author cnblogs.com/far ...
- 本周ddl(4.1-4.5)
本周ddl(4.1-4.5) cs61a首先完成2.23之前的任务 cs61a完成3.1之前的学习 cs61a完成3.8任务并且ants完成阶段1 csapp的bomblab 记录南京5个景点及其周边 ...
- vue-router设置页面切换滑动效果的方法及解决遇到的坑
先上gif:这里演示顺序是1232121 1.router.js中配置入口路由 { path: '/', redirect: '/index' } 2.main.js中new vu ...
- SAP Adobe Form 教程二 表
本文将介绍一些进阶内容,前文:SAP Adobe Form 教程一 简单示例 方法和对比 使用表对象(Table Object)创建表 优点: 它简单易行. 当我们只有很少的字段单行时,我们可以使用它 ...
- SqlServer2008R2 在开始菜单中找不到配置管理器
直接找到C:\Windows\SysWOW64\SQLServerManager10.msc,打开即可.