在直播系统中,除了直播音视频之外,有时候还想从主播端发布文本信息等,这些信息可以不通过视频传输通道发送给用户播放端,但如果传输的数据想和视频保持精准同步,那最好的办法就是这些信息和视频数据打包在一起传输,并通过h264 sei方式就可以把数据放入h264 Access Unit中传输。

扩展SEI有使用场景:

1、公告广播:推送将相对/绝对时间戳/时间/公告内容发到播放端,播放端实时接收消息并做相应的逻辑处理;

2、冲顶大会:推流端实时将题目分发到播放端,借助于大牛直播SDK低延迟特性,轻松实现“音-画-题”同步接收;

3、直播:推流端将歌词/字幕分发到播放端,播放端实时绘制出歌词;

4、应急指挥/单兵:推送端将GIS信息/现场采集到的数据实时写入并分发到播放端;

5、在线教育:推流端将激光笔涂鸦操作分发到播放端,播放端实时划圈划线,实现特定特效。

扩展SEI调用demo(以Windows平台为例):

1. 启动推送端软件: SmartPublisherDemo.exe,可到 Github 下载大牛直播SDK的相关测试软件或demo源码。

2. 做如下配置:

3. 可以点击自动发送文本按钮;

4. 打开播放端SmartPlayer.exe查看数据传输播放效果:

扩展SEI调用demo代码说明:

1. 推送端(对应工程:WIN-PublisherSDK-CPP-Demo):

     /*++++发送用户自定义数据相关接口++++*//** 1. 目前使用sei机制发送用户自定数据到播放端* 2. 这种机制有可能会丢失数据, 所以这种方式不保证接收端一定能收到* 3. 优势:能和视频保持同步,虽然有可能丢失,但一般的需求都满足了* 4. 目前提供两种发送方式 第一种发送二进制数据, 第二种发送 utf8字符串*//** 设置发送队列大小,为保证实时性,默认大小为3, 必须设置一个大于0的数* 如果数据超过队列大小,将丢掉队头数据* 这个接口请在 StartPublisher 之前调用*/NT_UINT32(NT_API *SetPostUserDataQueueMaxSize)(NT_HANDLE handle, NT_INT32 max_size, NT_INT32 reserve);/** 清空用户数据队列, 有些情况可能会用到,比如发送队列里面有4条消息再等待发送,又想把最新的消息快速发出去, 可以 * 先清除掉正在排队消息, 再调用PostUserXXX  **/NT_UINT32(NT_API *ClearPostUserDataQueue)(NT_HANDLE handle);/** 发送二进制数据* data: 二进制数据* size:数据大小* 注意: 1.目前数据大小限制在256个字节以内,太大可能会影响视频传输,如果有特殊需求,需要增大限制,请联系我们* 2. 如果积累的数据超过了设置的队列大小,之前的队头数据将被丢弃* 3. 必须再调用StartPublisher之后再发送数据*/NT_UINT32(NT_API *PostUserData)(NT_HANDLE handle, const NT_BYTE* data, NT_UINT32 size, NT_INT32 reserve);/** 发送utf8字符串* utf8_str: utf8字符串* 注意: 1. 字符串长度不能超过256, 太大可能会影响视频传输,如果有特殊需求,需要增大限制,请联系我们* 2. 如果积累的数据超过了设置的队列大小,之前的队头数据将被丢弃* 3. 必须再调用StartPublisher之后再发送数据*/NT_UINT32(NT_API *PostUserUTF8StringData)(NT_HANDLE handle, NT_PCSTR utf8_str, NT_INT32 reserve);/*----发送用户自定义数据相关接口----*/

2. 播放端(对应工程:WIN-PlayerSDK-CPP-Demo):

     /*设置用户数据回调*/NT_UINT32(NT_API *SetUserDataCallBack)(NT_HANDLE handle,NT_PVOID call_back_data, NT_SP_SDKUserDataCallBack call_back);/*设置视频sei数据回调*/NT_UINT32(NT_API *SetSEIDataCallBack)(NT_HANDLE handle,NT_PVOID call_back_data, NT_SP_SDKSEIDataCallBack call_back);
/*
*
* 用户数据回调,目前是推送端发送过来的
* data_type: 数据类型,1:表示二进制字节类型. 2:表示utf8字符串
* data:实际数据, 如果data_type是1的话,data类型是const NT_BYTE*, 如果data_type是2的话,data类型是 const NT_CHAR*
* size: 数据大小
* timestamp: 视频时间戳
* reserve1: 保留
* reserve2: 保留
* reserve3: 保留
*/
typedef NT_VOID(NT_CALLBACK* NT_SP_SDKUserDataCallBack)(NT_HANDLE handle, NT_PVOID user_data,NT_INT32  data_type,NT_PVOID  data,NT_UINT32 size,NT_UINT64 timestamp,NT_UINT64 reserve1,NT_INT64  reserve2,NT_PVOID  reserve3);/*
*
* 视频的sei数据回调
* data: sei 数据
* size: sei 数据大小
* timestamp:视频时间戳
* reserve1: 保留
* reserve2: 保留
* reserve3: 保留
* 注意: 目前测试发现有些视频有好几个sei nal, 为了方便用户处理,我们把解析到的所有sei都吐出来,sei nal之间还是用 00 00 00 01 分隔, 这样方便解析
* 吐出来的sei数据目前加了 00 00 00 01 前缀
*/
typedef NT_VOID(NT_CALLBACK* NT_SP_SDKSEIDataCallBack)(NT_HANDLE handle, NT_PVOID user_data,NT_BYTE*  data,NT_UINT32 size,NT_UINT64 timestamp,NT_UINT64 reserve1,NT_INT64  reserve2,NT_PVOID  reserve3);

SEI优势

1. 不依赖于相关协议,rtsp和rtmp都可以,其他协议只要播放端支持SEI解析的都可以使用;

2.  兼容性很好,如果播放端不支持自定义SEI数据解析,把SEI数据丢给H264解码器,解码器只是忽略掉,并不影响正常播放,上述操作也可以用VLC来播放,播放正常,只是不显示SEI消息;

3. 在视频帧携带,完全和视频保持同步,这个是其他传输通道无法做到的。

如何在RTSP/RTMP直播过程中加入SEI扩展数据发送和接收解析相关推荐

  1. EasyRTMP手机直播推流到EasyDSS进行RTMP直播过程中分辨率反复切换崩溃问题解决

    前篇博客介绍了Android EasyRTMP App的一些功能以及简单实现.这篇博客介绍一下我们遇到的一个BUG,以及它的出现原因,解决方式. 这个bug是在切换分辨率的时候,偶尔会出现App崩溃. ...

  2. 直播过程中的掌声,口哨,背景音等音效怎么实现

    大家有没有想过在直播过程中的掌声,口哨,背景音等音效是怎么实现的吗?这些功能都是可以通过混音来实现的.本篇文章介绍即构科技音视频SDK高级功能第五篇,ZegoLiveRoom SDK 混音功能,还是以 ...

  3. 直播平台开发,防止直播过程中被截屏或录屏

    直播平台开发,防止直播过程中被截屏或录屏 Activity创建时设置WindowManager.LayoutParams.FLAG_SECURE属性,该属性能防止屏幕被截图和录制.以下为修复代码示例: ...

  4. 如何在php7.2/php7.3中安装mcrypt扩展?

    mcrypt 是php里面重要的加密支持扩展库,linux环境下该库在默认情况下不开启.window环境下,PHP>=5.3,默认开启mcrypt扩展.mcrypt扩展是mcrypt加密库的接口 ...

  5. matlab换挡程序,一种基于MATLAB换挡过程中快速锁定分析数据的方法与流程

    本发明涉及汽车变速器数据分析,特别的,涉及一种基于matlab换挡过程中快速锁定分析数据的方法. 背景技术: 自动变速器的核心功能是能根据驾驶员意图进行自动换挡,解放驾驶员的左脚:在自动变速器的使用过 ...

  6. as3 访问远程计算机,Flash AS3中数据发送与接收

    Flash AS3中数据发送与接收 互联网   发布时间:2008-10-06 01:24:53   作者:佚名   我要评论 先回顾一下as2中相关的解决办法 相信大部分人用的都是LoadVars类 ...

  7. 在Z-stack中,我们调用数据发送函数,可以发送的最大字节数即ASDU最大是多少呢?

    在Z-stack中,我们调用数据发送函数,可以发送的最大字节数即ASDU最大是多少呢? 在f8wConfig.cfg文件中定义了 /* Set the MAC MAX Frame Size (802. ...

  8. EasyDSS流媒体服务器成功实现5G超高清8k视频RTMP/HLS(m3u8)直播过程中遇到的一些坑(insta360 4k/8k直播)

    自从2019年春节回来之后,5G直播就如雨后春笋一般,各大公司和运营商都在推行5G 4K.8K高清直播,当然,这也就卖火了insta360这款设备了,各家都在用这个设备做360全景高清4k.8k直播, ...

  9. 几款优秀的点播、RTSP/RTMP直播播放器介绍

    1.ijkplayer 项目地址: https://github.com/Bilibili/ijkplayer 介绍:Ijkplayer 是Bilibili发布的基于 FFplay 的轻量级 Andr ...

最新文章

  1. Linux+Apache2+openssl实现https验证
  2. 3 个重要因素,带你看透 AI 技术架构方案的可行性
  3. 脚踏板USB接口与无线遥控连接方案论证
  4. HDU 2022 海选女主角
  5. App上线前产品经理自查的清单
  6. JavaWeb学习笔记九 过滤器、注解
  7. 分享GitHub上一些嵌入式相关的高星开源项目
  8. IOS开发之手势——UIGestureRecognizer 共存
  9. oracle的dbcp工具类,DBCP数据源的使用
  10. Leetcode 276.栅栏涂色
  11. Python全栈之路系列----之-----守护进程\进程锁\队列\生产者消费者模式\数据共享\进程池(同步,异步)\回调函数\concurrent.futures模块...
  12. 阶段3 1.Mybatis_11.Mybatis的缓存_2 延迟加载和立即加载的概念
  13. 通用权限管理概要设计说明书
  14. 怎么测试佩戴适合眼镜软件,如何在网上选择到适合自己的眼镜框?
  15. 全面了解三极管——三极管用作开关管1
  16. java把汉字转换成拼音
  17. 如何与朋友同步观看YouTube视频
  18. java计算机毕业设计企业员工考勤系统的设计与实现源代码+数据库+系统+lw文档
  19. 记一个bug:ImportError: cannot import name ‘comb‘
  20. android动态贴纸实现原理,人脸动态贴纸sdk算法详解,人脸动态贴纸功能如何实现...

热门文章

  1. 存储过程的参数可以使用sql的函数
  2. 计算机的网络技术的普及,计算机网络技术的普及与应用-网络技术论文-计算机论文(7页)-原创力文档...
  3. array.slice_Ruby中带有示例的Array.slice()方法
  4. 离散数学和组合数学什么关系_关系类型| 离散数学
  5. Java编程经典10道_Java经典编程题50道之十二
  6. mysql5.5.20安装_mysql5.5.20安装文档
  7. stl取出字符串中的字符_在C ++ STL中使用比较运算符比较两个字符串
  8. Redis持久化的几种方式——深入解析RDB
  9. Android如何关闭Application
  10. 英语笔记:写作:Limiting the use of disposable plastic bags