首页 > 其他分享 >SkeyeRTMPPusher推送RTMP扩展支持HEVC(H265)

SkeyeRTMPPusher推送RTMP扩展支持HEVC(H265)

时间:2023-02-27 15:02:21浏览次数:44  
标签:body HEVC ++ H265 uint8 general SkeyeRTMPPusher hvcc

不久前刚实现SkeyeRTMPPusher扩展支持h265推送,当时在网上也查找了很多资料,发现都不尽详细,而官方也没有更新对HEVC(H265,后文统称HEVC)tag的支持,反正是走了不少弯路,当然,在广大网友以及​​ffmpeg​​代码的帮助下我最终实现了通过SkeyeRTMPPusher推送HEVC视频帧数据到SkeyeSMS,这里我将把实现过程详细的记录下来,供广大网友参考。

首先, RTMP头部信息封装并没有定义HEVC,我们采用CDN联盟的HEVC扩展标准,将HEVC的VideoTagHeader定义为12,详见下图:

SkeyeRTMPPusher推送RTMP扩展支持HEVC(H265)_i++

然后,我们在H264封装的基础上进行改进,以支持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:AVC
body[i++] = (m_metadata.nVideoCodec == FLV_CODECID_HEVC) ? 0x1C:0x17;// 1:Iframe 7:AVC 12:HEVC

if (m_bWaitingKeyFrame)
{
m_bWaitingKeyFrame = false;
}
}
else
{
//body[i++] = 0x27;// 2:Pframe 7:AVC
body[i++] = (m_metadata.nVideoCodec == FLV_CODECID_HEVC) ? 0x2C:0x27;// 1:Iframe 7:AVC 12:HEVC
}
body[i++] = 0x01;// AVC NALU
body[i++] = 0x00;
body[i++] = 0x00;
body[i++] = 0x00;

// NALU size
body[i++] = size>>24;
body[i++] = size>>16;
body[i++] = size>>8;
body[i++] = size&0xff;

有相关的技术问题,欢迎大家和我进行技术交流: ​​[email protected]​​ 大家也可以加入SkeyeRTMP直播推流技术 QQ群进行讨论: 102644504

标签:body,HEVC,++,H265,uint8,general,SkeyeRTMPPusher,hvcc
From: https://blog.51cto.com/openskeye/6088511

相关文章

  • RTMP推送扩展支持HEVC(H265)之Metadata结构填写详解
    鉴于广大码友对上一篇文章​​RTMP推送扩展支持HEVC(H265)​​的Metadata数据结构还存在不清楚的地方,这里对RTMP推送Metadata的结构进行详解。首先,我们先讲解下H.264/AVC......
  • RTP分包模式(H264/H265)
       在rfc6184-h264文档5.4章节有详细说明、以及rfc7798-h265文档4.2章节中也有部分介绍。一、NALUHeader●H264NALUHeader(1byte)结构图如下:F:   1 bit......
  • HEVC扩展备用安装方法
    这个玩意微软商店免费但是下架了,购买需要RMB安装转到https://store.rg-adguard.net/在左侧的下拉菜单选择“ProductId”把链接中“ProductID=”后面的部分......
  • ffmpeg让普通h265视频实现免二次编码SDR to HDR
    参考了这个文章https://cnlang.org/thread-36995-1-1.html工具:ffmpeg/小丸工具箱/安卓ffmpeg以及基于ffmpeg的软件(比如quickcut)使用条件:懂得基本的ffmpeg命令/小......
  • 各种显卡H265/HEVC/VP9/AV1格式4K和8K视频硬解码支持列表
    DXVAChecker解码检测工具DXVAChecker是一个显卡硬件加速检测工具,用于检测显卡的DirectX视频加速(DXVA)功能,DXVA是微软公司专门定制的视频加速规范,DXVAChecker能够检查当前......
  • FFmpeg H265解码总结
    背景:项目开发需要,通过TCP协议与视频板进行通信,获取图像数据,对图像数据进行解码后显示。关键词:C#、FFmpeg、FFmpeg.AutoGen.dll、WriteableBitmap、H265、HEVC1.初设计......
  • ffmpeg5.0+h264+h265 windows下编译方法
    目录前言一,源码包下载1.ffmpeg下载2.下载x264代码3.下载x265代码二,MSYS2安装三,安装cmake工具四,代码编译1.编译x2642.编译x2653.编译ffmpeg五,功能验证1.x264......
  • hevc
    https://blog.csdn.net/fanyun_01/article/details/112055961  ......
  • ffmpeg cuda加速 h264->hevc(h265) 缩小存储空间
    参考的原文链接https://www.cnblogs.com/Hakurei-Reimu-Zh/p/14999269.html1.安装cuda这里我只安装最新版驱动也是可以的没有刻意去安装cuda2.下载编译好的全版本ffmpe......