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的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中的相关描述。
系统头应包含对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。
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; config=1588 ; size-Length=13 ; indexLength=3 ; indexDeltaLength=3 ; constantDuration=1024。
采用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主档次支持的选项和工具主要有:
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)。
实际上,我们在实现GB28181-2016的时候,就已经针对H.265、AAC编码做了设定:
设置如下:
//视频编码类型选择++++++++++
videoEncodeTypeSelector = (Spinner)findViewById(R.id.videoEncodeTypeSelector);
final String[] videoEncodeTypes = new String[]{"软编(H.264)", "硬编(H.264)", "硬编(H.265)"};
ArrayAdapter adapterVideoEncodeType = new ArrayAdapter(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这块会渗透到各行各业。