RTSP/GB28181/EHOME协议安防视频融合平台EasyCVR视频云服务报错 “Assertion desc failed at src/libswscale/swscale_internal
TSINGSEE青犀视频云-边-端协同架构中的安防视频云服务EasyCVR是一个视频融合平台,负责国标GB/T28181、海康SDK、ONVIF、RTSP协议、Ehome协议等多种标准的安防视频流的接入和转发,可实现安防视频流的快速采集、转流上云能力。支持网络摄像机(Axis,Bosch、海康威视、大华、宇视、华为等主流品牌)、GB/T28181设备/平台、Ehome协议等通过标准协议接入云资源。也可通过各类型上云网关,将RTSP协议、Onvif协议、海康SDK等内网设备/平台接入云资源。接入云端的安防视频可对接包括云转码、云直播、云存储和CDN加速分发等一系列视频服务,最大限度的拓展监控视频的应用能力。
在EasyCVR开发过程中,对于视频的解码会出现“Assertion desc failed at src/libswscale/swscale_internal.h:668”错误,导致整个程序崩溃。
由给出的代码提示可以看出为 libswscale 中的错误。libswscale 的作用主要为格式转化的功能。于是我们定位到主要是 sws_getContext 函数出现错误。当该函数获取的高度height不正确时,就会出现此种错误。
img_convert_ctx = sws_getContext(width, height, codecCtx->pix_fmt, codecCtx->width, codecCtx->height, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);
该函数中 width 和 height 是由外部函数传递进入的,因此没办法进行控制,当调用者传递出错误的数据时,比如 0 确实会出现此种错误。
一种解决办法是检验 width 和 height 的值,对于不符合的值,直接提示输入参数错误。
此种解决方法主要是进行检验,认真检查代码逻辑后,发现此函数不需要进行转换高度和宽度的转化,因此用原先的高度和长度即可,因此不进行检验,直接使用解码的高度和宽度,代码如下:
img_convert_ctx = sws_getContext(codecCtx->width, codecCtx->height, codecCtx->pix_fmt, codecCtx->width, codecCtx->height, AV_PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);
上面函数即使用了解码器中的高度codecCtx->height和宽度codecCtx->width。修改完毕后代码正常运行。
EasyCVR作为TSINGSEE青犀视频云-边-端架构中唯一一款视频各大协议视频融合平台,具有很高的开放性和兼容性,我们提供了丰富的二次开发接口让大家调用。通过EasyCVR接入,将这些设备端的音/视频数据进行采集、转换、输出,进行全平台(PC、Android、iOS)、全终端直播(C/S、Web、App、H5、微信、小程序),并且EasyCVR视频智能融合共享平台能够将视频源的直播数据对接到第三方CDN网络服务或者第三方流媒体服务,实现传统安防设备互联网级别的直播与分发!此外,平台提供试用版本供大家测试使用,欢迎大家的了解。