首页 > 其他分享 >RTMP推送扩展支持HEVC(H265)之Metadata结构填写详解

RTMP推送扩展支持HEVC(H265)之Metadata结构填写详解

时间:2023-02-23 14:33:12浏览次数:54  
标签:body HEVC ++ H265 uint8 NAL RTMP lpMetaData configurationVersion

鉴于广大码友对上一篇文章​​RTMP推送扩展支持HEVC(H265)​​的Metadata数据结构还存在不清楚的地方,这里对RTMP推送Metadata的结构进行详解。

首先, 我们先讲解下 H.264/AVC metadata 语法,方便大家理解,这相关的文章大家在网上很容易找到,如果大家比较熟悉可以跳过;

参考:《ISO/IEC 14496-15 NAL unit structured video》AVCDecoderConfigurationRecord结构:(最小长度7字节)

RTMP推送扩展支持HEVC(H265)之Metadata结构填写详解_数据结构

说明: libSkeyeRTMPPusher我们称之为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格式)

RTMP推送扩展支持HEVC(H265)之Metadata结构填写详解_数据结构_02

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字节)

RTMP推送扩展支持HEVC(H265)之Metadata结构填写详解_数据结构_03

HEVC metadata 示例

RTMP推送扩展支持HEVC(H265)之Metadata结构填写详解_i++_04

metadata 如上metasize 11124| 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

SkeyeRTMP中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;

从上一篇文章​​RTMP推送扩展支持HEVC(H265)​​我们了解了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​


标签:body,HEVC,++,H265,uint8,NAL,RTMP,lpMetaData,configurationVersion
From: https://blog.51cto.com/openskeye/6081197

相关文章

  • Nginx+Rtmp推流服务器方案
    推流服务器方案一一、前期准备操作系统:Centos7Linux系统Nginx版本:nginx-1.22.0.tar.gzRTMP模块:nginx-rtmp-module推流工具:OBS-Studio拉流工具二、环境搭建1.安......
  • FFmpeg:搭建rstp/rtmp/HLS服务器(测试推流)
    在日常开发中,有些时候需要做一些推拉流测试,但又找不到可以测试的拉流地址,这个时候,可以使用rtsp-simple-server来搭建rtsp/rtmp/HLS服务器。1.服务器搭建rstp-simple-ser......
  • RTP分包模式(H264/H265)
       在rfc6184-h264文档5.4章节有详细说明、以及rfc7798-h265文档4.2章节中也有部分介绍。一、NALUHeader●H264NALUHeader(1byte)结构图如下:F:   1 bit......
  • 一个简单的RTMP服务器实现 --- RTMP与H264
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 一个简单的RTMP服务器实现 --- RTMP与FLV
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 一个简单的RTMP服务器实现 --- RTMP复杂握手(Complex Handshake)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • 一个简单的RTMP服务器实现 --- RTMP实现要点
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • SRS之RTMP推拉流分析
    SRS是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181;本文以SRS4.0版本进行分析RTMP推拉流架构,SRS整体架构如下图(官网图片)所示: 有图可......
  • RTMP录屏直播屏幕数据获取与MediaCodec编码
    目录前言RTMP直播实现流程视频采集——MediaProjection编码——MediaCodec音频采集——AudioRecordRTMP音频包数据RTMP视频数据前言本文介绍的是MediaProjection录屏、麦......
  • ubuntu20.04搭建Nginx+rtmp服务器
    1.ubuntu20.04安装Nginx代理服务器安装nginxsudoaptupdatesudoaptinstallnginx安装完成后,Nginx将会自动被启动。运行下面的命令来验证:   测试安装在网页......