英创Linux主板低成本网络视频监控实现方案

 2019-9-10     作者:黄志超     [nemail]    
[lablebox]

  在工业现场实际的应用中,有很多场景仅需要监测单路视频图像,同时对系统成本更为敏感。针对这类的应用,我们推出了一套低成本的方案,即使用ESM7000系列主板来实现相应功能。ESM7000系列主板的CPU为双核Cortex-A7,主频1GHz的i.MX7D,并且有着低功耗的特点,因为CPU没有专门的硬件视频处理单元,所以售价比ESM6802便宜。与之前英创公司推出了基于ESM6802主板的多通道网络摄像头方案相比较,ESM7000方案属于低成本应用方案,而ESM6802方案则主要针对需要同时显示多路网络摄像头数据的用户,利用CPU中专门的硬件视频处理单元来处理多路数据的输出。


  下面是对两套方案主要性能的对比:


主板型号ESM6802ESM7000
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);


  例程运行效果截图:


英创Linux主板低成本网络摄像头实现方案.png

[lablebox]