在工业现场实际的应用中,有很多场景仅需要监测单路视频图像,同时对系统成本更为敏感。针对这类的应用,我们推出了一套低成本的方案,即使用ESM7000系列主板来实现相应功能。ESM7000系列主板的CPU为双核Cortex-A7,主频1GHz的i.MX7D,并且有着低功耗的特点,因为CPU没有专门的硬件视频处理单元,所以售价比ESM6802便宜。与之前英创公司推出了基于ESM6802主板的多通道网络摄像头方案相比较,ESM7000方案属于低成本应用方案,而ESM6802方案则主要针对需要同时显示多路网络摄像头数据的用户,利用CPU中专门的硬件视频处理单元来处理多路数据的输出。
下面是对两套方案主要性能的对比:
主板型号 | ESM6802 | ESM7000 |
CPU主频 | 双核Cortex A9,1GHz | 双核Cortex A7,1GHz |
支持网络摄像头显示通道数 | 最多可同时显示4路,可以支持多路切换 | 单路显示,可以支持多路切换 |
百片价 | ¥710/片 | ¥540/片 |
因为ESM7000系列主板的CPU没有硬件视频处理单元,而网络摄像头传输过来的数据是通过了编码(常见的H.264、MPEG-4、MJPEG等格式)的,所以需要使用软件来进行解码,利用软件解码相对来说需要消耗一定的CPU资源,并且无法支持多路摄像头数据的拼接显示,所以只能够同时支持一路摄像头数据的显示。
实现软件解码的库已经在主板中移植好了,用户可以直接使用,经过我们测试,采用200W像素网络摄像头(1920×1080)和分辨率为1024×600的屏幕,将单路摄像头数据通过软件解码后以分辨率800×450输出到显示窗口中,消耗的CPU资源大约为20%左右,内存(1GB)为4%左右。可以看出对于ESM7000系列主板来说,并没有占用太多的硬件资源,同时还能够进行其他的控制操作,比如配合网络摄像头厂商提供的API函数实现截图,上传,录像等。
软件上同样还是使用gstreamer和Qt来实现,ESM7000系列主板的文件系统中已经集成了gstreamer和Qt5.8相关的库和工具,并且包含了处理网络摄像头通讯协议rtsp和使用软件编解码的插件,而gstreamer能够支持多种图形系统包括Qt。所以利用gstreame能够快速方便的获取网络摄像头的数据并显示到Qt界面中,关于gstreamer的详细介绍,可以参考网站https://gstreamer.freedesktop.org/documentation/index.html?gi-language=c。
在实现ESM6802主板多路网络摄像头方案中,英创公司通过库文件libemgst.so提供三个API函数和一个包含网络摄像头信息的结构体变量。在此基础上,我们将ESM7000系列板卡的支持也添加进去了,对于用户来说使用的API函数完全相同,唯一一点区别是ESM7000系列板卡只能同时支持一路网络摄像头的数据显示。库文件内部会自动判断板卡型号,并进行对应的处理,用户只需要专注于应用程序的开发和界面的设计上面。
关于API函数和例程在《ESM6802主板支持多路网络摄像头》已经有了详细的介绍,因为API函数是相同的,所以可以使用相同的例程代码测试,只需要更换对应的工具链重新编译即可,详细的资料可以参考《ESM6802主板支持多路网络摄像头》。我们在这里重复说明一下API函数的定义,方便用户查询:
/** * 初始化gstreamer * * 本函数在C的main函数中调用,将会初始化gstreamer库 * * 参数说明: * 使用main函数的两个参数填入,gstramer初始化时需要读取main函数的两个参数 * * 返回值说明: * 无返回值 * */ void init_emgst(int argc, char **argv); /** * 包含网络摄像头设备信息的结构体 * 访问网络摄像头需要有ip地址,用户名和密码。如果是播放录像文件,还需要填入 * 录像文件的地址,如果是播放实时数据,路径填写为NULL即可。 * * 参数说明: * ip:指向网络摄像头ip地址的指针 * user:指向网络摄像头的用户名的指针 * passwd:指向网络摄像头密码的指针 * file:指向录像文件路径的指针,如果播放实时图像,赋值为NULL * */ typedef struct _Rtsp_config { char *ip; char *user; char *passwd; char *file; } Rtsp_config; /** * 配置gstreamer,并显示到指定Qt窗口 * * 函数会配置gstreamer,显示多个网络摄像头的数据到xwinid所指定的窗口,窗口的大 * 小通过参数width和height来确定,而网络摄像头的信息由指针rtsp_config传入,listsize * 指定同时显示的通道数量。因为要动态建立网络摄像头的连接,函数不会退出,所以 * 需要在线程中调用。 * * 参数说明: * xwinid:Qt窗口的id号,每一个窗口类中都包含这个成员变量。 * width:显示视频数据所使用的窗口控件的宽度,单位pixel * height:显示视频数据所使用的窗口控件的高度,单位pixel * rtsp_config:指向设备信息结构体的指针,通常是一组包含设备信息的结构体指针。 * 详细解释可以查看对结构体Rtsp_config的说明 * listsize:ESM7000系列主板视频通道数最多支持同时显示1路,超过1路会返回-1报错。 * * 返回值说明: * 0 表示正常退出gstreamer * -1 表示填入参数出现错误,启动gstreamer失败 * */ int config_emrtsp(unsigned int xwinid, int width, int height, Rtsp_config *rtsp_config, int listsize); /** * 关闭gstreamer,释放资源 * * 函数会关闭gstreamer输出,并释放相关资源 * * 返回值说明: * 无返回值 * */ void release_emrtsp(void);
例程运行效果截图:
成都英创信息技术有限公司 028-8618 0660