本文主要是介绍X-Space系列进阶教程六之实时视频传输原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天我们给大家讲讲我们的视频传输的原理,也就是对Mjpg_Stream进行源码分析,我将给大家按照我之前发表的论文里面的内容给大家进行讲解,当然力求为了让大家可以更简单的了解到实时视频传输的原理呢,我也会在原来论文的基础上修改一下,让大家更加清晰易懂。
我们的视频传输技术基于开源的Mjpg_Streamer,简单说呢就是它采用多线程技术,通过运行抓图线程,以及并发的服务器线程来实现的,具体工作流程如下:
1. 首先通过V4L2对摄像头进行初始化,包括视频尺寸等设置。
2. 根据我们启动的参数呢,设置下输出初始化,比如使用的端口号,主页文件的目录等。
3. 创建抓图线程,以阻塞方式等待图像数据,并且将图像处理为JPEG文件,对于YUYV格式的图像输出先要转换成RGB格式,然后调用libjpeg库压缩成JPEG文件,对于MJPEG格式需要插入Huffman数据表,处理完一帧图像后通知所有等待数据的客户端线程。
4. 创建并发服务器线程,以阻塞方式监听客户端HTTP请求,并且为每个客户端单独创建线程。
5. 当有客户端进行连接时,创建客户端处理线程,给客户端发送特殊的HTTP响应头,目的为了使服务器端可以不断的发送JPEG数据给客户端。
6. 整个工作流程图如下所示。
由于Mjpg_Streamer并没有给我们准备一个开源的客户端解码的程序,所以我们需要对服务器端发送的HTTP数据进行分析,自己写一个关于视频解码的程序,首先给大家详细分析下服务器端发送的数据,刚建立连接时是先发送数据头,包含了Content-Type和boundary等设置,之后进入循环,每次在发送数据之前都先发一个Content-Type:image/jpeg的头,然后再以内存映射方式将图像发送出去,然后再发送一个包含BOUNDARY的尾,依次循环,数据流图如图所示。
详细的代码如下:
/*******************************
这篇关于X-Space系列进阶教程六之实时视频传输原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!