EasyRTMP推送扩展支持HEVC(H265) RTMP推送之Metadata结构填写详解
我们在《EasyNVR摄像机网页直播中,推流组件EasyRTMP推送RTMP扩展支持HEVC(H.265)的方案》中描述了关于EasyRTMP进行RTMP HEVC(H.265)推流的概括性实现描述,其中,对于Metadata数据结构,很多流媒体开发者还存在不清楚的地方,这里对RTMP推送Metadata的结构进行详解。
首先, 我们先讲解下 H.264/AVC metadata 语法,方便大家理解,这相关的文章大家在网上很容易找到,如果大家比较熟悉可以跳过;
参考:《ISO/IEC 14496-15 NAL unit structured video》AVCDecoderConfigurationRecord结构:(最小长度7字节)
说明:
libEasyRTMP我们称之为Metadata,而在FFmpeg中,则称之为extradata,extradata解析,详见ff_h264_decode_extradata()
注意:
第5字节的最后2位,表示的就是NAL size的字节数。在AVCC格式中,每个NAL前面都会有NAL size字段。NAL size可能是1字节、2字节或4字节(4字节较常见),解析extradata重要目的就是确认这个值。(而Annex-B格式,要split NAL,只要去探测0x000001就可以了)
H.264 metadata 示例(AVCC格式)
metadata 如上
metasize 47
05| FF NAL size: 4字节
06| E1 SPS num: 1
07| 00 1F SPS size: 31字节
09| 67 NAL type: SPS
40| 01 PPS num: 1
41| 00 05 PPS size: 5字节
42| 68 NAL type: PPS
H.265/HEVC metadata语法
参照HEVCDecoderConfigurationRecord:(最小长度23字节)
HEVC metadata 示例
metadata 如上
metasize 111
24| 20 NAL type: VPS
25| 00 01 VPS num: 1
27| 00 19 VPS size: 25字节
54| 21 NAL type: SPS
55| 00 01 SPS num: 1
57| 00 29 SPS size: 41字节
100| 22 NAL type: PPS
hvcC extradata是一种头描述的格式。而annex-b格式中,则是将VPS, SPS和PPS等同于普通NAL,用start code分隔,非常简单。Annex-B格式的”extradata”:
start code+VPS+start code+SPS+start code+PPS
EasyRTMP中metadata填写VPS,SPS和PPS填写如下:
body[i++] = 0x03; // numOfArrays
body[i++] = 0x20; // configurationVersion
body[i++] = 0x00; // configurationVersion
body[i++] = 0x01; // configurationVersion
// vps data length
body[i++] = lpMetaData->nVpsLen>>8&0xff;
body[i++] = lpMetaData->nVpsLen&0xff;
// vps data
memcpy(&body[i],lpMetaData->Vps,lpMetaData->nVpsLen);
i= i+lpMetaData->nVpsLen;
body[i++] = 0x21; // configurationVersion
body[i++] = 0x00; // configurationVersion
body[i++] = 0x01; // configurationVersion
// sps data length
body[i++] = lpMetaData->nSpsLen>>8&0xff;;
body[i++] = lpMetaData->nSpsLen&0xff;
// sps data
memcpy(&body[i],lpMetaData->Sps,lpMetaData->nSpsLen);
i= i+lpMetaData->nSpsLen;
body[i++] = 0x22; // configurationVersion
body[i++] = 0x00; // configurationVersion
body[i++] = 0x01; // configurationVersion
// pps data length
body[i++] = lpMetaData->nPpsLen>>8&0xff;
body[i++] = lpMetaData->nPpsLen&0xff;
// pps data
memcpy(&body[i],lpMetaData->Pps,lpMetaData->nPpsLen);
i= i+lpMetaData->nPpsLen;
我们了解了HEVCDecoderConfigurationRecord结构:
typedef struct HEVCDecoderConfigurationRecord {
uint8_t configurationVersion;
uint8_t general_profile_space;
uint8_t general_tier_flag;
uint8_t general_profile_idc;
uint32_t general_profile_compatibility_flags;
uint64_t general_constraint_indicator_flags;
uint8_t general_level_idc;
uint16_t min_spatial_segmentation_idc;
uint8_t parallelismType;
uint8_t chromaFormat;
uint8_t bitDepthLumaMinus8;
uint8_t bitDepthChromaMinus8;
uint16_t avgFrameRate;
uint8_t constantFrameRate;
uint8_t numTemporalLayers;
uint8_t temporalIdNested;
uint8_t lengthSizeMinusOne;
uint8_t numOfArrays;
HVCCNALUnitArray *array;
} HEVCDecoderConfigurationRecord;
由于我们可以不必要关心其他的结构,所以我们从numOfArrays填写起,这里是三个数据信息结构(vps,sps,pps),numOfArrays=3,然后HVCCNALUnitArray结构进行填写数据头信息:
typedef struct HVCCNALUnitArray {
uint8_t array_completeness;
uint8_t NAL_unit_type;
uint16_t numNalus;
uint16_t *nalUnitLength;
uint8_t **nalUnit;
} HVCCNALUnitArray;
如VPS填写如下:
body[i++] = 0x20; // configurationVersion
body[i++] = 0x00; // configurationVersion
body[i++] = 0x01; // configurationVersion
// vps data length
body[i++] = lpMetaData->nVpsLen>>8&0xff;
body[i++] = lpMetaData->nVpsLen&0xff;
其他如SPS和PPS同理,见上文代码。这一点和H264 metadata结构填写是有很大的区别。
参考文章:
https://blog.csdn.net/yue_huang/article/details/75126155
EasyRTMP是TSINGSEE青犀开放平台(http://open.tsingsee.com)一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,支持Windows、Linux、arm(hisiv100/hisiv200/hisiv300/hisiv400/etc…)、Android、iOS平台,支持市面上绝大部分的RTMP流媒体服务器,包括Red5、Ngnix_rtmp、crtmpserver等主流RTMP服务器,能够完美应用于各种行业的直播需求,手机直播、桌面直播、摄像机直播、课堂直播等等方面!
EasyRTMP推送扩展支持HEVC(H265) RTMP推送之Metadata结构填写详解的更多相关文章
- EasyNVR摄像机网页直播中,推流组件EasyRTMP推送RTMP扩展支持HEVC(H.265)的方案
众所周知,RTMP标准协议实际是不支持HEVC(H.265)编码格式的,同样,现行的H5标准里面,也没有对H.265的描述,所以,在很大程度上,H5网页浏览器是无法接入HEVC(H.265)的,但是, ...
- EasyRTMP实现Demux解析MP4文件进行rtmp推送实现RTMP直播功能
本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52965101 前面已经介绍过EasyRTMP,这里不 ...
- 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解
注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...
- RTMP、RTSP、HTTP视频协议详解(转)
一.RTMP.RTSP.HTTP协议 这三个协议都属于互联网 TCP/IP 五层体系结构中应用层的协议.理论上这三种都可以用来做视频直播或点播.但通常来说,直播一般用 RTMP.RTSP.而点播用 H ...
- RTMP、RTSP、HTTP视频协议详解(附:直播流地址、播放软件)
- javaCV开发详解之6:本地音频(话筒设备)和视频(摄像头)抓取、混合并推送(录制)到服务器(本地)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- javaCV开发详解之12:视频转apng动态图片实现,支持透明通道,也支持摄像机、桌面屏幕、流媒体等视频源转apng动态图
wjavaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG. ...
- javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
- javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...
随机推荐
- Kotlin协程第一个示例剖析及Kotlin线程使用技巧
Kotlin协程第一个示例剖析: 上一次https://www.cnblogs.com/webor2006/p/11712521.html已经对Kotlin中的协程有了理论化的了解了,这次则用代码来直 ...
- js 变量以及函数传参
一.变量: 基本类型是变量对象重新创建一个新值给变量对象空间,虽然是同一个值但是互不影响. 引用类型是也是将一个值重新赋值给新的变量空间,但是这个值是堆中对象的一个指针,新的变量和旧的变量指向是同一个 ...
- delete,drop,truncate的区别?
drop:是删除表的结构 delete:删除表的数据 truncate:删除表的数据,并且对id进行重新排序.
- linux中添加自定义命令
centos下设置alias别名,比较简单,例如: vim /root/.bashrc addalias rm='rm -i' Linux alias设置指令的别名命令详解 功能说明:设置指令的别名. ...
- jvm 堆栈概念
关于JVM的工作原理以及调优是一个向往已久的模块,终于有幸接触到:http://pengjiaheng.iteye.com/blog/518623 那就顺着这个思路,来梳理一下自己看到后的结论和感想. ...
- 如何在Windows上部署Redis集群和SpringBoot进行整合
一.安装Redis的Windows版本并进行配置 (1)下载链接 https://github.com/microsoftarchive/redis/releases (2)将下载后的Redis复制成 ...
- SpringBoot源码分析-编译环境与新建测试模块
建议 分析源码建议不要使用Idea或者Eclipse等IDE工具的反编译功能或者导入源码包的方式看源码,那样不能给框架的源码做注释,所以分析源码之前都得先下载源码并构建,然后在项目中新建一个Modul ...
- Python入门(一)-打开世界之Hello World
关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 今天我们来用Python向世界说声Hello World,人生 ...
- 初识 Python 作业及默写
1.简述变量量命名规范 2.name = input(“>>>”) name变量是什么数据类型? 3.if条件语句的基本结构? 4.用print打印出下面内容: 文能提笔安天下, 武 ...
- Ajax 的一些概念 解析
什么是Ajax Ajax基本概念 Ajax(Asynchronous JavaScript and XML):翻译成中文就是异步的JavaScript和XML. 从功能上来看是一种在无需重新加载整个网 ...