众所周知,RTMP标准协议实际是不支持HEVC(H.265)编码格式的,同样,现行的H5标准里面,也没有对H.265的描述,所以,在很大程度上,H5网页浏览器是无法接入HEVC(H.265)的,但是,在很多原生客户端中,对HEVC(H.265)的需求是非常大的,那么,像EasyNVR中,如果需要接入HEVC(H.265)流的时候,我们应该如何支持呢?

不久前刚实现EasyRTMP扩展支持h265推送,当时在网上也查找了很多资料,发现都不尽详细,而官方也没有更新对HEVC(H265,后文统称HEVC)tag的支持,反正是走了不少弯路,当然,在广大网友以及ffmpeg代码的帮助下我最终实现了通过EasyRTMP推送HEVC视频帧数据到EasyDSS,这里我将把实现过程详细的记录下来,供广大网友参考。
首先, RTMP头部信息封装并没有定义HEVC,我们采用CDN联盟的HEVC(H.265)扩展标准,将HEVC的VideoTagHeader定义为12,详见下图:
EasyRTMP支持HEVC(H.265)推流
然后,我们在H.264封装的基础上进行改进,以支持HEVC头部的封装,而HEVC头有
SPS PPS VPS,我们参考ffmpeg的HEVCDecoderConfigurationRecord结构对metadata进行封装,该结构体代码如下:

typedef struct HVCCNALUnitArray {uint8_t  array_completeness;uint8_t  NAL_unit_type;uint16_t numNalus;uint16_t *nalUnitLength;uint8_t  **nalUnit;
} HVCCNALUnitArray;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;

参考ffmeg对该结构进行初始化如下:


static void hvcc_init(HEVCDecoderConfigurationRecord *hvcc)
{memset(hvcc, 0, sizeof(HEVCDecoderConfigurationRecord));hvcc->configurationVersion = 1;hvcc->lengthSizeMinusOne   = 3; // 4 bytes/** The following fields have all their valid bits set by default,* the ProfileTierLevel parsing code will unset them when needed.*/hvcc->general_profile_compatibility_flags = 0xffffffff;hvcc->general_constraint_indicator_flags  = 0xffffffffffff;/** Initialize this field with an invalid value which can be used to detect* whether we didn't see any VUI (in which case it should be reset to zero).*/hvcc->min_spatial_segmentation_idc = MAX_SPATIAL_SEGMENTATION + 1;
}

需要注意的是,该结构其他参数我们其实可以不特别关心,我们只需要在HVCCNALUnitArray数组中把HEVC的VPS,SPS和PPS信息填入即可。

最后,填写好Metadata信息后,我们还需要在发送帧数据的时候做一下修改,将I帧的tag头改成12,P帧tag不变,设置成1即可,如下代码所示:

 int i = 0;if(bIsKeyFrame){//body[i++] = 0x17;// 2:Pframe  7:AVCbody[i++] =   (m_metadata.nVideoCodec  == FLV_CODECID_HEVC) ? 0x1C:0x17;// 1:Iframe  7:AVC 12:HEVCif (m_bWaitingKeyFrame){m_bWaitingKeyFrame = false;}}else{//body[i++] = 0x27;// 2:Pframe  7:AVCbody[i++] =      (m_metadata.nVideoCodec  == FLV_CODECID_HEVC) ? 0x2C:0x27;// 1:Iframe  7:AVC 12:HEVC}body[i++] = 0x01;// AVC NALUbody[i++] = 0x00;body[i++] = 0x00;body[i++] = 0x00;// NALU sizebody[i++] = size>>24;body[i++] = size>>16;body[i++] = size>>8;body[i++] = size&0xff;

EasyRTMP是TSINGSEE青犀开放平台(http://open.tsingsee.com)一套调用简单、功能完善、运行高效稳定的RTMP功能组件,经过多年实战和线上运行打造,支持RTMP推送断线重连、环形缓冲、智能丢帧、网络事件回调,支持Windows、Linux、arm(hisiv100/hisiv200/hisiv300/hisiv400/etc…)、Android、iOS平台,支持市面上绝大部分的RTMP流媒体服务器,包括Red5、Ngnix_rtmp、crtmpserver等主流RTMP服务器,能够完美应用于各种行业的直播需求,手机直播、桌面直播、摄像机直播、课堂直播等等方面!

转载于:https://www.cnblogs.com/babosa/p/11124023.html

EasyNVR摄像机网页直播中,推流组件EasyRTMP推送RTMP扩展支持HEVC(H.265)的方案相关推荐

  1. 网页直播中推流组件EasyRTM推送RTMP扩展支持HEVC(H265)

    https://blog.csdn.net/easynvr/article/details/90597942

  2. EasyNVR摄像机网页直播之问题解决:Failed_SYSTEM_CurrentCont......_Application_EasyNVR_Service registry key alr

    背景分析 经常使用EasyNVR产品的用户都知道,作为音视频行业互联网直播产品,EasyNVR主要功能在于通过RTSP/ONvif协议,接入前端音视频采集设备,通过EasyNVR软硬件产品将拉取过来的 ...

  3. 最简单的基于FFmpeg的推流器(以推送RTMP为例)

    ===================================================== 最简单的基于FFmpeg的推流器系列文章列表: <最简单的基于FFmpeg的推流器(以 ...

  4. EasyRTMP手机直播推送rtmp流flash无法正常播放问题

    本文转自EasyDarwin团队Kim的博客:http://blog.csdn.net/jinlong0603/article/details/52960750 问题简介 EasyRTMP是EasyD ...

  5. 直播平台开发过程中关于谷歌fcm推送介绍

    在直播平台开发中要集成谷歌fcm,首先需要满足一下条件: 1.设备必须是android4.0以上,Google Play Services 必须是 11.2.0以上版本 2.Android SDK M ...

  6. php主动推送弹幕_百万在线的美拍直播弹幕系统的实时推送技术实践之路

    1.内容概述 1.jpg (30.13 KB, 下载次数: 321) 2 年前 上传 直播弹幕是直播系统的核心功能之一.如何迅速作出一个有很好扩展性的弹幕系统?如何应对业务迅速发展?相信很多工程师/架 ...

  7. (转)基于libRTMP的流媒体直播之 AAC、H264 推送

    参考: 1,基于libRTMP的流媒体直播之 AAC.H264 推送 http://billhoo.blog.51cto.com/2337751/1557646 转载于:https://www.cnb ...

  8. idea中git替换,推送到新的github或者gitlab上面

    借鉴 目录 git使用,命令行 初始化本地仓库,并提交内容到本地 连接到远程仓库,并将代码同步到远程仓库 继续修改本地代码,然后提交并推送到github idea中git使用合并分支 修改项目的git ...

  9. ad域推送软件_如何在域管理环境中进行软件的推送安装

    如何在域管理环境中进行软件的推送安装 1, 要把你准备分发的软件制作成 .msi 软件安装包 . 在 Windows2000 安装光盘运行 x:\Valueadd\3rdparty\Mgmt\Wins ...

最新文章

  1. cannot import name filter
  2. lhgselect 联动选择下拉菜单 v1.0.0 (2011-06-13)
  3. matlab multithreading spyder,spyder和python的关系是什么
  4. 对象属性结构赋值_面向对象之构造器、代码块和内部类
  5. CSS3渐变——线性渐变
  6. Linux、命令ps 各字段意思
  7. HTML中浮动的特性,浅谈CSS浮动的特性
  8. Quartus II13.1 simulate13.1 详细安装教学
  9. 大逃杀吃鸡毒圈的制作
  10. 面试题(javamysql)
  11. 七个研究生必备高效科研网站
  12. CDR各版本文件不兼容的原因
  13. Python中回文数和质数问题的解决
  14. 我该如何向我的朋友解释“01背包”问题?
  15. 阿里合伙人制度的意义及法律分析
  16. 请描述定时器初值的计算方式_51波特率发生器定时器初值计算方法[转载]
  17. 日记侠:如何在微信赚钱?你要学会细分思维!
  18. 什么是自动语音识别?
  19. 深入.NET 第五章 体检套餐
  20. 记录mybatis添加表数据时报出的错误:Could not set property ‘id‘ of ‘class com.xxx.Manager with value ‘xx...xx‘

热门文章

  1. SharePoint 2010 BCS - 简单实例(二)外部列表创建
  2. 在WinRT中读取资源文件
  3. DataTable排序,检索,合并,筛选
  4. 关于C#值类型,引用类型,值传递,引用传递
  5. 一个想法--开发与业务,我们互相依赖
  6. sql 两个表字段不一样合并查询_数据分析进阶--SQL多表查询
  7. 哪些模块可用于python性能分析_Python调用C模块以及性能分析
  8. linux 脚本 变量为空,Shell脚本中判断输入变量或者参数是否为空的方法
  9. jsp 修改的员工select怎么_jdbc+jsp实现简单员工管理系统|chu
  10. resin如何部署java项目_resin项目换成tomcat部署的两种方式