首页 > 其他分享 >GB28181设备接入侧如何支持H.265?

GB28181设备接入侧如何支持H.265?

时间:2023-07-24 21:32:01浏览次数:71  
标签:视频 H.265 编码 GB28181 PS long 接入 int

技术背景

一直以来,GB28181-2022之前的规范版本让人诟病的一点:没有明确针对H.265的说明,特别是监控摄像机,H.265已然成为标配,GB/T28181-2022规范,终于针对H.265做了明确的说明,让我们来一起解读下规范:

基于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中的相关描述。

GB28181设备接入侧如何支持H.265?_GB28181支持265

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

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

基于RTP的视音频封装

H.265视频流的RTP封装

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

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

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)。

技术实现

GB28181设备接入侧如何支持H.265?_GB28181 H265_02

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

设置如下:

//视频编码类型选择++++++++++
        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) {

            }
        });

考虑到Android端设备编码性能,Android平台H.265编码,我们仅支持硬编码,如果需要H.265硬编,只需要调用SetSmartPublisherVideoHevcHWEncoder()接口即可,其中,第二个参数是针对编码码率的设定。

/**
     * 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硬编码,需要注意的是,Native Media NDK硬编码,需要Android 5.0以上系统,而且接口并不像原生那么全:

    /**
     * 设置视频硬编码是否使用 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);

针对H.265硬编码,其他接口设计如下:

	/*
	* 设置视频硬编码码率控制模式
	* @param hw_bitrate_mode: -1表示使用默认值, 不设置也会使用默认值, 0:CQ, 1:VBR, 2:CBR, 3:CBR_FD, 请参考:android.media.MediaCodecInfo.EncoderCapabilities
	* 注意硬编码和手机硬件有关,多数手机只支持部分码率模式, 另外硬编码设备差异很大,不同设备同一码率控制模式效果可能不一样
	* @return {0} if successful
	*/
	public native int SetVideoHWEncoderBitrateMode(long handle, int hw_bitrate_mode);


	/*
	 * 设置视频硬编码复杂度, 安卓5.0及以上支持
	 * @param hw_complexity: -1表示不设置, 请参考:android.media.MediaCodecInfo.EncoderCapabilities.getComplexityRange() 和 android.media.MediaFormat.KEY_COMPLEXITY
	 * 注意硬编码和手机硬件有关,部分手机可能不支持此设置
	 * @return {0} if successful
	 */
	public native int SetVideoHWEncoderComplexity(long handle, int hw_complexity);

	/*
	 * 设置视频硬编码质量, 安卓9及以上支持, 仅当硬编码器码率控制模式(BitrateMode)是CQ(constant-quality mode)时才有效
	 * @param hw_quality: -1表示不设置, 请参考:android.media.MediaCodecInfo.EncoderCapabilities.getQualityRange() 和 android.media.MediaFormat.KEY_QUALITY
	 * 注意硬编码和手机硬件有关,部分手机可能不支持此设置
	 * @return {0} if successful
	 */
	public native int SetVideoHWEncoderQuality(long handle, int hw_quality);

	/*
	 * 设置视频硬编码最大码率, 安卓没有相关文档说明, 所以不建议设置,
	 * @param hw_max_bitrate: 每秒最大码率, 单位bps
	 * @return {0} if successful
	 */
	public native int SetVideoHWEncoderMaxBitrate(long handle, long hw_max_bitrate);

相关调用如下:

int hevcHWKbps = setHardwareEncoderKbps(false, video_width_, video_height_);
hevcHWKbps = hevcHWKbps*fps/25;
Log.i(TAG, "hevcHWKbps: " + hevcHWKbps);

int isSupportHevcHWEncoder = libPublisher
                    .SetSmartPublisherVideoHevcHWEncoder(publisherHandle, hevcHWKbps);

if (isSupportHevcHWEncoder == 0) {
  libPublisher.SetNativeMediaNDK(publisherHandle, 0);
  libPublisher.SetVideoHWEncoderBitrateMode(publisherHandle, 0); // 0:CQ, 1:VBR, 2:CBR
  libPublisher.SetVideoHWEncoderQuality(publisherHandle, 39);

  // libPublisher.SetVideoHWEncoderMaxBitrate(publisherHandle, ((long)hevcHWKbps)*1200);

  Log.i(TAG, "Great, it supports hevc hardware encoder!");
}

总结

GB28181-2022针对H.265描述,是2016的补充,随着今年七月份开始针对2022的实施推广,相信GB28181这块会应用到各行各业,如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景。GB28181设备接入端支持H.265难度不大,平台侧如果需要web播放,一般来说是需要转H.264在播放,对国标平台侧的专门性能提高了要求,如果是cs架构,问题不大。

标签:视频,H.265,编码,GB28181,PS,long,接入,int
From: https://blog.51cto.com/daniusdk/6815811

相关文章

  • GB28181设备接入端如何播放语音广播数据
    技术背景语音广播功能是GB28181设备接入端非常重要的功能属性,语音广播让终端和平台之间,有了实时双向互动,可以满足执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育、远程办公、明厨亮灶、智慧交通、智慧工地、雪亮工程、平安乡村、生产运输、车载终端等场景的技术诉求。这里......
  • 国标GB28181视频平台LntonGBS(含源码)国标视频平台播放视频时偶尔出现播放失败的问题解
    LntonGBS是基于公安部推出的安防主流协议(国标GB28181协议)的视频接入、处理及分发平台,具有视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲等功能,能够涵盖所有监控领域的视频能力需求,已经在大量的项目中落地应用,如明厨亮灶、平安乡村、雪亮工程等。有用户反馈,在某项......
  • 国标GB28181视频平台LntonGBS(源码版)国标云服务平台对页面过多导致加载困难的问题解决
    LntonGBS国标视频云服务平台不仅支持无缝、完整接入内网或者公网的国标设备,在输出上,实现全平台、全终端输出。平台可将GB/T28181设备/平台推送的PS流转成ES流,并提供RTSP、RTMP、FLV、HLS、WebRTC等多种格式视频流的分发服务,实现Web浏览器、手机浏览器、微信端、PC客户端等各终端无......
  • AspnetCore接入Nacos配置中心
    一、什么是nacosNacos/nɑ:kəʊs/是DynamicNamingandConfigurationService的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服......
  • 多语言高并发接入阿里巴巴电商平台,获取实时商品详情数据源码,API接口技术开发分享
    接口数据展示alibaba.item_get-获得商品详情公共参数请求地址:注册key和secret接入请私信名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString......
  • 多语言高并发接入阿里巴巴电商平台,获取实时商品详情数据源码,API接口技术开发分享
    接口数据展示alibaba.item_get-获得商品详情公共参数请求地址:注册key和secret接入名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_sear......
  • 硬盘录像机通过国标GB28181协议注册到EasyCVR,为何频繁出现断流?
    EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。有用户反馈,设备录像机通过国标GB28181协议注册到EasyCVR平......
  • Android平台GB28181设备接入端语音广播技术探究和填坑指南
    技术背景GB/T28181-2016官方规范和交互流程,我们不再赘述。SIP服务器发起广播流程示意图如下:需要注意的是:语音广播通知、语音广播应答命令消息头Content-type字段为Content-type:Application/MANSCDP+xml。语音广播通知、语音广播应答命令采用MANSCDP协议格式定义。消息示例如下:......
  • Android平台GB28181设备接入侧音频采集推送示例
    技术背景GB/T28181是广泛应用于视频监控行业的标准协议规范,可以在不同设备之间实现互联互通。今天我们主要探讨Android平台的Audio采集部分。先说如何拿到数据源,在Android平台上采集音频,常用的方式如下:使用MediaRecorder类:MediaRecorder类提供了一组API,可以用于录制音频。您可以使......
  • 如何接入API接口
    如何接入API接口对接流程申请api平台账号开通接口权限对接api测试上线1.如何测试?假如需要接收并处理微信消息,研发人员需掌握任意一种JAVA、Go、PHP、Python、Node.js等后端代码即可。首先后台提交注册,点击进行测试,注册完成后,进入后台自助系统,选择试用版,即可使用代码......