GB/T28181-2022针对H.265、AAC的说明和技术实现

时间:2023-02-13 16:56:09

GB/T28181-2022规范说明

GB/T28181-2022相对来GB/T28181-2016针对H.265、AAC的更新如下:

——更改了“联网系统通信协议结构图”,媒体流通道增加了 H.265、G.722.1、AAC(见 4.3.1,

2016 年版的 4.3.1)。

——增加了对 H.265、AAC 的支持(见 6.2、A.2.1.9、附录 C、附录 F、附录 G)。

——更改了附录 C,补充了 H.265 封装描述(见附录 C,2016 年版附录 C)。

——更改了附录 F,补充了 H.265 编解码技术要求、AAC 格式(见附录 F,2016 年版的附录 E)。

基于RTP的视音频数据封装

基于RTP的视音频数据PS封装

基于RTP的PS封装首先按照ISO/IEC 13818-1:2019将视音频流封装成PS包,再将PS包以负载的方式封装成RTP包。

进行PS封装时,应将母个悦team Map),系统头和PSM放置于PS包头之后、第一十 ti(System Header)和 PSM(Program Stream Map),系统头和PSM放置于PS包头之后、第一个PES包

之前。

典型的视频关键帧PS包结构如图C.1所示,其中 PESV为视频PES包,PESA为音频PES包,视频非关键帧的PS包结构中一般不包含系统头和PSM。PS包中各部分的具体数据结构参见ISO/IEC13818-1 :2019中的相关描述。

GB/T28181-2022针对H.265、AAC的说明和技术实现

系统头应包含对PS包中码流种类的描述,其中视频和音频的流ID(stream_id)取值如下:

a)视频流ID:0xEO;

b)音频流ID:0xCO。

针对本文件规定的几种视音频格式,PSM中流类型(stream_type)的取值如下:

a) MPEG-4视频流:0x10;

b)H.264视频流:0x1B;

c) SVAC视频流:0x80;

d)H.265视频流:0x24;

e)G.711A律音频流:0x90;

f)G.711U律音频流:0x91;

g)G.722.1音频流:0x92;

h)G.723.1音频流:0x93;

i)G.729音频流:0x99;

j)sVAC音频流:0x9B;

k)AAC音频流:0xOF。

PS包封装的其他具体技术规范详见ISO/IEC 13818-1:2019。

PS包的RTP封装格式参照IETF RFC 2250,RTP的主要参数设置如下:a)负载类型( payload type) :96;

b)编码名称(encoding name) ; PS;c)时钟频率(clock rate):90kHz;

d)SDP描述中“m”字段的“media”项:video。

基于RTP的视音频封装

H.265视频流的RTP封装

H.265的RTP载荷格式应符合IETF RFC 7798的相关规定。

H.265视频流RTP包的负载类型(Payload Type)标识号选定:从IETF RFC3551协议表5的动态范围(96~~127)中选择,建议定为100,根据实际需要填充。

音频流的RTP封装,这里我们主要看看AAC的

AAC的主要参数。AAC音频流的RTP载荷格式应符合IETF RFC 3640的相关规定,参数规定如下:

l)负载类型(PT):从IETF RFC 3551:2003表5的动态范围(96~127)中选择,建议定

为102;

2)编码名称(encodingname):AAC;

3)时钟频率( clock rate):参考ISO/IEC 14496-3:2019表1.18“Sampling Frequency

Index”,宜采用8kHz;

4)通道数:参考ISO/IEC 14496-3;2019表1.17“Channel Configuration”,宜使用1;5)SDP描述中“m”字段的“media”项:audio;

6)SDP描述中“a”字段定义AAC音频格式时需携带rtpmap和 fmtp参数,内容格式应符合

IETF RFC 3640,例如:

a=rtpmap:102 AAC/8000/1

a =fmtp;102 streamtype=5 ; profile-level-id=16; mode=AAC-hbr; cnotallow=1588 ; size-Length=13 ; indexLength=3 ; indexDeltaLength=3 ; cnotallow=1024。

H.265视频编﹑解码技术要求

H.265的档次和水平

采用H.265标准的视频编码应至少支持ITU-T H.265(2019)视频标准的主档次(MainProfile),水平(Level)应至少支持到Level 2,标清应用宜扩展支持到Level 3,高清应用宜扩展支持到Level 4;视频解码所支持的档次和水平应不低于编码支持的最高档次和水平,至少应支持到H.265视频标准主档次的Level 4。视频解码宜扩展支持 H.265主档次(Main Profile)中的B帧工具,且相邻两Р帧间的B帧个数不大于2。

H.265主档次视频编码标准的具体描述详见ITU-T H.265(2019)的相关规定。

H.265主档次的选项和工具

H.265主档次支持的选项和工具主要有:

a)比特深度限制为8 bit;

b)采样限制为4∶ 2∶ 0;

c)CTB的大小从16×16到64×64;

d)在水平(Level)支持的最大分辨率下﹐解码图像的缓存容量限制为6幅图像﹐若水平(Level)下

分辨率变小,解码图像的缓存容量可大于6幅图像,但不应超过16幅图像;

e)允许选择波前和片划分方式,但是不能同时选择。

采用H.265编码标准的视频流应为H.265主档次视频流,编码应支持上述主档次选项和工具中的部分或全部;H.265的解码至少应支持上述全部选项和工具。

多参考帧编码时,P片的参考帧数一般不大于两帧,且不应超过15帧。

为了保证码流解析的效率,比特流中应当在每个Ⅰ帧之前都出现相应的视频参数集(Video Param-eter Set,VPS)、序列参数集(Sequence Parameter Set, SPS)和图像参数集(Picture Parameter Set,PPS)。

技术实现

GB/T28181-2022针对H.265、AAC的说明和技术实现

实际上,我们在实现GB28181-2016的时候,就已经针对H.265、AAC编码做了设定:

设置如下:

//视频编码类型选择++++++++++
videoEncodeTypeSelector = (Spinner)findViewById(R.id.videoEncodeTypeSelector);
final String[] videoEncodeTypes = new String[]{"软编(H.264)", "硬编(H.264)", "硬编(H.265)"};
ArrayAdapter<String> adapterVideoEncodeType = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, videoEncodeTypes);
adapterVideoEncodeType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
videoEncodeTypeSelector.setAdapter(adapterVideoEncodeType);

videoEncodeTypeSelector.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {

if (isRTSPPublisherRunning || isPushingRtmp || isGB28181StreamRunning || isRecording) {
Log.e(TAG, "Could not switch video encoder type during publishing..");
return;
}

videoEncodeType = position;
Log.i(TAG, "[视频编码类型]Currently choosing: " + videoEncodeTypes[position] + ", videoEncodeType: " + videoEncodeType);
}

@Override
public void onNothingSelected(AdapterView<?> parent) {

}
});

接口设计:

/**
* Author: daniusdk.com
* Set Video H.265(hevc) hardware encoder, if support H.265(hevc) hardware encoder, it will return 0(设置H.265硬编码)
*
* @param kbps: the kbps of different resolution.
*
* @return {0} if successful
*/
public native int SetSmartPublisherVideoHevcHWEncoder(long handle, int kbps);

/**
* 设置视频硬编码是否使用 Native Media NDK, 默认是不使用, 安卓5.0以下设备不支持
* @param handle
* @param is_native: 0表示不使用, 1表示使用, sdk默认是0.
* @return {0} if successful
*/
public native int SetNativeMediaNDK(long handle, int is_native);

AAC还是PCMA编码:

class ButtonPCMAListener implements View.OnClickListener {
public void onClick(View v) {
is_pcma_ = !is_pcma_;

if (is_pcma_)
btnPCMA.setText("当前PCMA编码");
else
btnPCMA.setText("当前AAC编码");
}
}

接口设计:

/**
* Set audio encoder type(设置音频编码类型)
*
* @param type: if with 1:AAC, if with 2: SPEEX, if with 3: PCMA
*
* @return {0} if successful
*/
public native int SmartPublisherSetAudioCodecType(long handle, int type);

总结

实际上,GB28181-2022针对H.265、AAC的说明,确切的说算是2016的补充,特别是像我们做Android平台GB28181设备接入模块,实际上从GB28181-2016过渡到GB28181-2022难度不大,或者说仅有很少的改动即可,随着今年七月份开始针对2022的实施推广,相信GB28181这块会渗入到各行各业。