在工业现场实际的应用中,也有很多场景仅需要坚持单路视频图像,同时对系统成本更为敏感。针对这类的应用,我们推出了一套低成本的方案,即使用ESM6800E/H或者ESM7000系列主板来实现相应功能。ESM6800E/H主板的CPU为单核Cortex-A7,主频792MHz的i.MX6ULL,而ESM7000系列主板的CPU为双核Cortex-A7,主频1GHz的i.MX7D,并且Cortex-A7有着低功耗的特点,因为CPU没有专门的硬件视频处理单元,所以售价相对便宜。
下面是对几种方案主要性能的对比:
主板型号 | ESM8000 | ESM6802 | ESM7000 | ESM6800E/H |
---|---|---|---|---|
CPU主频 | 四核Cortex A53,1.6GHz | 双核Cortex A9,1GHz | 双核Cortex A7,1GHz | 单核Cortex A7,792MHz |
支持网络摄像头显示通道数 | 可以支持多路显示和切换 | 可以支持多路显示和切换 | 最多可同时显示1路,可以支持多路切换 | 最多可同时显示1路,可以支持多路切换 |
因为ESM6800E/H和ESM7000系列主板的CPU没有硬件视频处理单元,而网络摄像头传输过来的数据是通过了编码(常见的H.264、MPEG-4、MJPEG等格式)的,所以需要使用软件来进行解码,利用软件解码相对来说需要消耗一定的CPU资源,并且无法支持多路摄像头数据的拼接显示,所以只能够同时支持一路摄像头数据的显示。
实现软件解码的库已经在主板中移植好了,用户可以直接使用,经过我们测试,在ESM7000主板上采用200W像素网络摄像头(1920×1080)和分辨率为1024×600的屏幕,将单路摄像头数据通过软件解码后以分辨率800×450输出到显示窗口中,消耗的CPU资源大约为20%左右,内存(1GB)为4%左右。可以看出对于ESM7000系列主板来说,并没有占用太多的硬件资源,同时还能够进行其他的控制操作,比如配合网络摄像头厂商提供的API函数实现截图,上传,录像等。
软件上同样还是使用gstreamer和Qt来实现,英创Linux主板的文件系统中已经集成了gstreamer和Qt5.8相关的库和工具,并且包含了处理网络摄像头通讯协议rtsp和使用软件编解码的插件,而gstreamer能够支持多种图形系统包括Qt。所以利用gstreame能够快速方便的获取网络摄像头的数据并显示到Qt界面中,关于gstreamer的详细介绍,可以参考网站GStreamer。
在上一篇多路网络摄像头方案中,英创公司通过库文件libemgst.so提供三个API函数和一个包含网络摄像头信息的结构体变量。在此基础上,我们将ESM6800E/H和ESM7000系列板卡的支持也添加进去了,对于用户来说使用的API函数完全相同,唯一一点区别是ESM6800E/H和ESM7000系列板卡只能同时支持一路网络摄像头的数据显示。库文件内部会自动判断板卡型号,并进行对应的处理,用户只需要专注于应用程序的开发和界面的设计上面。
关于API函数和例程在上一篇文章中已经有了详细的介绍,因为API函数是相同的,所以可以使用相同的例程代码测试,只需要更换对应的工具链重新编译即可。我们在这里重复说明一下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);
例程运行效果截图: