一种基于MJPG流传输的网络视频服务器及其设计、移植方法与流程

文档序号:14267492阅读:511来源:国知局
一种基于MJPG流传输的网络视频服务器及其设计、移植方法与流程

本发明涉及视频监控技术领域,具体地说是一种基于mjpg流传输的网络视频服务器及其设计、移植方法。



背景技术:

目前得到广泛应用的视频压缩技术有mpeg标准、h.264标准以及mjpeg标准。mpeg即movingpictureexpertsgroup,该组织于1988年成立,mpeg先后制定了mpeg-1、mpeg-2、mpeg-4三个标准。mpeg-1标准主要面向的是比特率1.5mbit/s以下cd-rom应用,mpeg-2标准所要求的比特率为2~30mbit/s,mpeg-4最主要的特色是高压缩比、易操作的可交互性以及统一接入能力。

h.264是继mpeg-4之后新出现的一种视频数据编码标准,h.264标准在技术上有准确度高、多模式的位移估计,分层的编码语法等优势。

mjpeg全称motionjointphotographicexpertsgroup,源于jpeg压缩技术,是24bpp的真彩色影像标准。mjpeg的压缩算法与mpeg一脉相承,具备优越的功能,可传输高质量图片,生成完全动画视频等。由于这种压缩本身技术限制,其相应的压缩效率不如h.264以及mpeg-4,进而导致需要的网络传输带宽也较大,一般要求在0.5mbps~1.5mbps。

横向比较上述3种视频压缩技术,h.264、mpeg标准具有更好的压缩效率和更强的网络适应能力,因而更适用于对画面质量和实时性要求较高的监控产品以及多路视频数据的传输,mjpeg虽然在技术上处于劣势,但就家庭个人等低端监控产品领域来讲,其技术能力以及现有网络传输带宽也完全可以满足客户需求。

如今很多高端的网络视频产品都以其为基本进行二次开发,网络视频服务器端同样可以以它作为编码组件进行快速二次开发以支持多种视频格式的传输。ffmpeg虽然拥有非常强大的视频采集、格式转换、抓图等功能。但是针对应用场景特定、视频格式特定的产品来说,ffmpeg往往显得过于臃肿,不够轻量,过多占用服务器端的硬件资源。



技术实现要素:

本发明的目的在于提供一种基于mjpg流传输的网络视频服务器及其设计、移植方法,用于解决现有组件占用硬件资源大,所需硬件成本高的问题。

本发明解决其技术问题所采用的技术方案是:一种基于mjpg流传输的网络视频服务器,包括参数输入模块、参数解析模块、判断模块、视频数据输入模块、视频数据输出模块和存储模块;所述参数输入模块用于通过命令行输入参数,所述参数解析模块用于解析所述输入参数,并将全局标识变量置为1,所述判断模块用于判断全局标识变量的值,并在全局标识标量为1时,将程序置于后台运行,所述视频数据输入模块用于获取视频数据,并将所述视频数据传输至存储模块,所述视频数据输出模块用于建立与客户端的联系并将视频数据发送至客户端。

进一步地,所述视频数据输入模块包括input_file插件、input_gspcavl插件、input_uvc插件和input_testpicture插件;所述input_file插件用于获取本地视频文件,input_gspcavl插件用于兼容旧版本的视频输入模块,input_uvc插件用于获取摄像头采集到的数据,input_testpicture插件用于对视频输入模块的测试。

进一步地,所述input_uvc插件还用于判断摄像头采集到的视频数据的格式,如果格式为mjpeg,则直接将数据发送至存储模块,如果格式是yuv,则压缩yuv为mjpeg,将数据发送至存储模块。

进一步地,所述input_uvc插件包括input_init接口函数、input_run接口函数、input_stop接口函数和input_cmd接口函数,所述input_init接口函数用于初始化互斥锁,解析命令行参数,并申请摄像头结构体,初始化摄像头硬件,input_run接口函数为存储模块分配内存空间并创建cam_thread线程获取摄像头采集到的数据,input_stop接口函数用于取消cam_thread线程,input_cmd接口函数用于设置摄像头硬件参数;

所述input_uvc插件还包括help函数、cam_thread函数和cam_cleanup函数,所述help函数用于打印调试信息,cam_thread函数用于将从摄像头获取到的数据进行压缩编码,并保存至存储模块,cam_cleanup函数用于清理线程,释放资源。

进一步地,所述视频数据输出模块包括请求发送单元、请求接收单元和视频数据发送单元,所述请求发送单元用于向客户端发送请求信号,请求接收单元用于接收客户端返回的请求成功信号,视频数据发送单元用于向客户端发送视频数据。

进一步地,所述视频数据输出模块包括output_http插件,所述output_http插件用于将存储模块内的视频数据通过网络发送给客户端,output_http插件包括线程单元,所述线程单元用于初始化一个tcpsocket以响应来自客户端的请求,当客户端出现多个连接请求时,所述线程单元同时创建多个客户端线程。

本发明的实施例还提供了一种基于mjpg流传输的网络视频服务器的设计方法,包括以下步骤:

指定默认情况下使用的输入、输出插件及其参数;

解析输入参数,在全局标识变量为1时,在后台创建进程,并初始化全局数据结构体;

检测输出插件的数量,并初始化输入、输出插件;

运行输入、输出插件,待客户端有信号出现时,向客户端发送视频数据。

进一步地,输入插件的运行过程为:

抓取一帧数据;

判断数据帧的大小,并将数据帧小于阈值的数据丢弃;

对原始jpg数据进行锁存,并复制到全局缓存区;

判断是否在yuv模式下;

若是,将yuv格式的数据转换为jpeg格式,并对数据进行压缩存储,若否,直接对数据进行存储;

解锁全局缓冲区,并更新数据帧。

进一步地,输出插件的运行过程为:

客户端发送请求;

服务器端检测到连接请求后,建立工作线程,接受请求;

接收客户端发送的控制命令,并在接收到数据采集命令后,激活数据采集线程,对图像数据进行处理后,执行数据发送线程,将视频数据发送给客户端。

本发明的实施例还提供了一种基于mjpg流传输的网络视频服务器的移植方法,包括以下步骤:

移植libjpeg库值嵌入式平台;

修改所有目录下的makefile文件,并指明libjpeg库的头文件路径和搜索路径;

将所有输入、输出插件分别拷贝至bin、lib目录下。

发明内容中提供的效果仅仅是实施例的效果,而不是发明所有的全部效果,上述技术方案中的一个技术方案具有如下优点或有益效果:

1、本发明实施例在开发了支持mjpeg格式的网络视频服务器,未借助现有的ffmpeg的代码,从而避免ffmpeg带来的臃肿,且能够实现视频数据的采集至传输的整个过程,减少对硬件资源的占用,降低产品硬件投入成本。

2、输入插件input_uvc能够将yuv格式的数据转换为jpeg格式,使网络视频服务器可处理多种文件格式,扩大网络视频服务器的使用范围。

3、所述线程单元用于初始化一个tcpsocket以响应来自客户端的请求,当客户端出现多个连接请求时,所述线程单元同时创建多个客户端线程,可应用在mjpg视频流从camera采集端到浏览器或者流媒体播放器的网络传输。

4、将网络视频服务器移植到嵌入式平台上,使网络视频服务器可同时应用于pc端和嵌入式平台,应用范围广。

附图说明

图1是本发明网络视频服务器的结构示意图;

图2是本发明网络视频服务器中输入、输出插件的体系示意图;

图3是本发明网络视频服务器设计方法的流程示意图;

图4是本发明网络视频服务器设计方法中输入插件的工作流程示意图;

图5是本发明网络视频服务器设计方法中输出插件的工作流程示意图;

图6是本发明网络视频服务器移植方法中的流程示意图。

具体实施方式

为能清楚说明本方案的技术特点,下面通过具体实施方式,并结合其附图,对本发明进行详细阐述。下文的公开提供了许多不同的实施例或例子用来实现本发明的不同结构。为了简化本发明的公开,下文中对特定例子的部件和设置进行描述。此外,本发明可以在不同例子中重复参考数字和/或字母。这种重复是为了简化和清楚的目的,其本身不指示所讨论各种实施例和/或设置之间的关系。应当注意,在附图中所图示的部件不一定按比例绘制。本发明省略了对公知组件和处理技术及工艺的描述以避免不必要地限制本发明。

如图1所示,本发明的一种基于mjpg流传输的网络视频服务器,包括依次连接的参数输入模块1、参数解析模块2、判断模块3、视频数据输入模块4、存储模块5和视频数据输出模块6。参数输入模块1用于通过命令行输入参数,所述参数解析模块2用于解析所述输入参数,并将全局标识变量置为1,所述判断模块3用于判断全局标识变量的值,并在全局标识标量为1时,将程序置于后台运行,视频数据输入模块4用于获取视频数据,并将所述视频数据传输至存储模块,视频数据输出模块5用于建立与客户端的联系并将视频数据发送至客户端。

其中全局标识变量的初始值为0,如果通过参数输入模块1输入的参数中包含b、background,则参数解析模块2在解析输入参数阶段将其置1,后续判断模块3进行判断时,将程序置于后台运行。视频数据输入模块4会源源不断的采集视频数据,没采集完一帧数据就会将数据发送至存储模块5进行保存,当接收到客户端发送的数据请求后,视频数据输出模块6将数据传输至客户端。

上述网络视频服务器是通过mjpg-streamer实现的,在mjpg-streamer中网络视频输入模块、网络视频输出模块分别存在多种输入、输出插件。

如图2所示,网络视频输入模块包括的插件有:input_file插件、input_gspcavl插件、input_uvc插件和input_testpicture插件。input_file插件用于获取本地视频文件,input_gspcavl插件用于兼容旧版本的视频输入模块,input_uvc插件用于获取摄像头采集到的数据,input_testpicture插件用于对视频输入模块的测试。网络视频输出模块包括的插件有:output_file插件,用于将输入插件传过来的视频数据保存到本地,output_http插件,用于将输入插件传过来的数据通过网络传输出去,output_autofocus用于计算每一帧视频数据的焦距。

本实施例的网络视频服务器选用的输入插件为input_uvc,输出插件为output_http。

input_uvc插件的功能是拿到摄像头数据,并判断数据格式,如果是mjpeg格式,直接调用memcpy_picture把数据拷贝到存储模块,如果是yuv格式,则调用compress_yuyv_to_jpeg压缩yuv为mjpeg,然后再把数据拷贝到存储模块(global.buf)。

input_uvc插件提供了4个供外部调用的接口函数:input_init、input_run、input_stop、input_cmd以及3个私有函数:help、cam_thread、cam_cleanup。其中,input_init用来初始化互斥锁,解析命令行参数,申请“摄像头”结构体vdin,并初始化摄像头硬件;input_run负责为globals.buf分配内存空间并创建cam_thread线程来获取摄像头采集到的数据。input_stop调用pthread_cancel完成主线程对cam_thread线程的取消。主线程和cam_thread线程同属一个进程空间,主线程通过发送信号来取消cam_thread线程。input_cmd用来设置摄像头硬件参数,实现对摄像头的控制。help用来打印调试信息到stderr;cam_thread为工作线程,用来从摄像头获取一帧数据经必要的压缩编码后保存到global.buf;cam_cleanup作线程清理,释放资源。

input_uvc插件还用于判断摄像头采集到的视频数据的格式,如果格式为mjpeg,则直接将数据发送至存储模块,如果格式是yuv,则压缩yuv为mjpeg,将数据发送至存储模块。在暗光环境下捕获的“corruptedframes(损坏的帧)”,其数据帧大小一般都要小于正常数据帧大小,比如vga(640x480)webcam捕获的正常数据帧都会大于8kbyte,所以我们这里可以根据实际情况设置一个阈值,当捕获的数据帧大小小于阈值时,就认为它是“corruptedframes”而丢弃,默认阈值为0,即捕获的数据帧均认为正常。

output_http插件通过socket编程来模拟http协议,http协议需要先让客户端发送一个请求,当服务器收到这个请求以后接下来它会发送应答报文,如果视频流请求成功,则响应“200”表示连接成功。接下来就是视频数据的发送了,当发送连续不断进行时,在客户端即可显示视频。

在output_http插件的httpd.c中实现了服务器对客户端的请求响应,里面的包含有4个发送函数:send_snapshot、send_stream、send_error和send_file,作用分别是发送单帧图像、发送视频数据、发送异常信息、发送文件需求信息。output_http插件还包括1个响应客户端控制命令的command函数,以及server_thread函数,server_thread函数用于开辟的服务器线程,并初始化一个tcpsocket以响应来自客户端的连接,当出现客户端连接请求时,server_thread函数可以为多达10个客户端同时创建client_thread线程并互不干扰的为各客户端分别做数据传输服务。

如图3所示,本发明的一种mjpg流传输的网络视频服务器的设计方法,包括以下步骤:

s11,指定默认情况下使用的输入、输出插件及其参数;

s12,解析输入参数,在全局标识变量为1时,在后台创建进程,并初始化全局数据结构体;

s13,检测输出插件的数量,并初始化输入、输出插件;

s14,运行输入、输出插件,待客户端有信号出现时,向客户端发送视频数据。

步骤s11中,命令行指定的输入、输出插件在input_init/output_init函数执行后,分别被记录到global.in、global.out(如果命令行未指定,则使用代码中指定的默认输入输出插件"input_uvc.so--resolution640x480--fps5--device/dev/video0"和"output_http.so--port8080")。步骤s14中,输入、输出插件运行后,输入、输出通道取放数据的缓冲区global.buf被申请,因此,global全局结构体是输入、输出通道之间进行数据沟通的纽带。

如图4所示,输入插件的运行过程为:

抓取一帧数据;

判断数据帧的大小,并将数据帧小于阈值的数据丢弃;

对原始jpg数据进行锁存,并复制到全局缓存区;

判断是否在yuv模式下;

若是,将yuv格式的数据转换为jpeg格式,并对数据进行压缩存储,若否,直接对数据进行存储;

解锁全局缓冲区,并更新数据帧。

如图5所示,输出插件与客户端进行通信和数据传输,输出插件的运行过程为:

网络视频服务器端的mpjg-streamer运行,并等待客户端发送的连接请求;

持续判断客户端是否有连接请求;

服务器端检测到连接请求后,建立工作线程,接受请求;

判断是否有客户端控制命令,并接收客户端发送的控制命令;

判断是否是数据采集命令并在接收到数据采集命令后,激活数据采集线程,对图像数据进行转换处理后,执行数据发送线程,将视频数据发送给客户端。

客户端的运行过程为:

启动监控程序,并向服务器端发送链接请求;

判断是否建立了与服务器的连接;

在建立连接后,客户端会进入用户输入界面,客户端接收用户输入的信息,并判断是都有控制命令,当有控制命令时,将该控制命令发送给服务器端;

接收服务器端发送的数据,并判断是都接收完成,在接收完成后,进行数据的显示和处理;

判断是否还需要继续进行操作,若是,重新判断用户输入的信息是否有控制命令,重复上述操作,若否,直接退出操作。

如图6所示,本发明的一种基于mjpg流传输的网络视频服务器的移植方法,包括以下步骤:

s21,移植libjpeg库值嵌入式平台;

s22,修改所有目录下的makefile文件,并指明libjpeg库的头文件路径和搜索路径;

s23,将所有输入、输出插件分别拷贝至bin、lib目录下。

上述实施例中的网络视频服务器只能直接编译安装到pc上,想要在嵌入式平台上使用需要进行移植。mjpg-streamer依赖于libjpeg,所以移植mjpg-streamer之前要先移植libjpeg。

以网络视频服务器移植到jz2440开发版为例。

步骤s22中,修改所有目录下的makefile文件包括:将cc=gcc修改为cc=arm-linux-gcc以支持交叉编译;修改plugins/input_uvc/makfile。

以上所述只是本发明的优选实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也被视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1