mjpg-streamer学习笔记1----mjpg-streamer移植

原创 2016年08月30日 20:35:31

1、什么是mjpg-streamer

  MJPG-streamer是一款免费基于IP地址的视频流服务器,它的输入插件从摄像头读取视频数据,这个输入插件产生视频数据并将视频数据复制到内存中,它有多个输出插件将这些视频数据经过处理,其中最重要的输出插件网站服务器插件,它将视频数据传送到用户浏览器中,MJPG-streamer的工作就是将其中的一个输入插件和多个输出插件绑定在一起,所有的工作都是通过它的各个插件完成的。

各个文件如下:

    (1)input_testpicture.so。这是一个图像测试插件,它将预设好的图像编译成一个头文件,可以在没有摄像头的情况下传输图像,从而方便调试程序。

    (2)input_uvc.so。此文件调用USB摄像头驱动程序V4L2,从摄像头读取视频数据。

    (3)input_control.so。这个文件实现对摄像头转动的控制接口

    (4)output_http.so。这是一个功能齐全的网站服务器,它不仅可以从单一文件夹中处理文件,还可以执行一定的命令,它可以从输入插件中处理一幅图像,也可以将输入插件的视频文件根据现有M-JPEG标准以HTTP视频数据服务流形式输出。

(5)output_file.so。这个插件的功能是将输入插件的JPEG图像存储到特定的文件夹下,它可以用来抓取图像


2、如何将mjpg-streamer移植到开发板上

(1)  libjpeg 的移植(因为MJPG-streamer依赖于jpeg库)

解压libjpeg库

tar xzvf libjpeg-turbo-1.2.1.tar.gz

切换到libjpeg库目录下

cd libjpeg-turbo-1.2.1

建目录tmp

mkdir tmp

 ./configure --host=arm-linux --prefix=$(pwd)/_install的含义

$ ./configure 下面两个都是运行configure时给的参数

--host=arm-linux 运行环境 (交叉编译成arm)

--prefix=$(pwd)/_install 安装目录

pwd是当前用户目录。


进行配置,--prefix=是指定安装目录/work/nfs_root/libpeg-turbo-1.2.1/tmp,--host=arm-linux是指定运行环境是arm

./configure --prefix=/work/nfs_root/libjpeg-turbo-1.2.1/tmp --host=arm-linux

编译

make

安装

make install

/work/nfs_root/libjpeg-turbo-1.2.1/tmp/lib/目录下的动态库拷贝到/work/nfs_root/fs_mini_mdev_new/lib/目录下(-d表示原来是链接文件也作为链接文件拷贝过去)

cp /work/nfs_root/libjpeg-turbo-1.2.1/tmp/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib/ -d


(2)  mjpg-streamer 的移植:

解压

tar xvf mjpg-streamer-r63.tar.gz

切换到mjpg-streamer-r63目录下

cd mjpg-streamer-r63


修改所有的Makefile 

arm-linux-gcc是交叉编译工具链,用于 编译出能在ARM平台上运行的程序,而gcc编译出来的程序在x86平台上运行 

--(1) 将 CC=gcc 修改为 CC=arm-linux-gcc 

--(2) 修改plugins/input_uvc/Makfile 

-O2是优化选项,-DLINUX -D_GNU_SOURCE-Wall表示打开所有需要注意的警告信息,-shared指定生成动态连接库,-fPIC 表示编译为位置独立的代码,

 -I/work/nfs_root/libjpeg-turbo-1.2.1/tmp/include 表示指定所需要的头文件

a. 将 
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC 
改为 
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /work/nfs_root/libjpeg-turbo-1.2.1/tmp/include 
注意: 
-I /work/jz2440/libjpeg-turbo-1.2.1/tmp/include    //  是编译libjpeg 生成的文件 

 

o: 编译的目标文件
a: 静态库,其实就是把若干o文件打了个包
so: 动态链接库(共享库)
lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息
la: 使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。

-L.:表示要连接的库在当前目录中

-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称,即libtest.so


b. 将 
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo 
                $(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo  
jpeg_utils.lo dynctrl.lo 
改为 
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo 
                $(CC) $(CFLAGS) -ljpeg -L /work/jz2440/libjpeg-turbo-1.2.1/tmp/lib -o 
$@ input_uvc.c
v4l2uvc.lo jpeg_utils.lo dynctrl.lo
编译

make

 mjpg_streamer /work/nfs_root/fs_mini_mdev_new/bin/目录下的动态库文件拷贝到/work/nfs_root/fs_mini_mdev_new/lib/ 目录下

cp mjpg_streamer /work/nfs_root/fs_mini_mdev_new/bin/

cp *so* /work/nfs_root/fs_mini_mdev_new/lib/ -d

mjpg_streamer -i "input_uvc.so -f 10 -r 320*240" -o "output_http.so -w www"

3、命令参数

     这个是我设置的参数:输入UVC,网页输出,图片输出(更详细的设置,建议去看源码)

         mjpg_streamer -i "input_uvc.so -f 10 -r 320*240 -y" -o "output_http.so -c "ruoyun:liufeng" -w www -p 8888" -o "output_file.so -d 1000 -f /mnt "  

      -i 输入

       "input_uvc.so -f 10 -r 320*240 -y"

       input_uvc.so:UVC输入组件

     -f  10             :表示10帧

     -r 320*240     :分辨率

     -y                   :YUV格式输入(有卡顿),不加表示MJPG输入(需要摄像头支持)


      -o输出

          "output_http.so -c "ruoyun:liufeng" -w www -p 8888" 

          output_http.so          :网页输出组件

          -c "ruoyun:liufeng"       :用户名:ruoyun        密码:liufeng

          -w www                                  : 网页输出

         -p 8888                                   :端口   8888


         "output_file.so -d 1000 -f /mnt "   

          output_file.so                  :图片输出组件

          -d 1000                                   : 时间1S

          -f /mnt                                       :输出图片放在哪,我是开机直接把/mnu挂载到本地文件夹了

4、使用

在firefox浏览器里面输入 http://192.168.1.1:8080/?action=stream ,应该能看到摄像头抓取的视频

动态视频:192.168.1.1:8080/?action=stream                
静态图像:192.168.1.1:8080/?action=snapshot


远程视频监控之应用篇(mjpg-streamer)

通过对mjpg-streamer的源码分析,让小伙伴们知道整个软件的流程。也介绍了如何移植,和设置参数。...

mjpg-streamer项目源码分析

前一段时间自己买了个开发板(GT2440的),可是我没有够相应的买cmos摄像头,可是又想做下国嵌的usb视频采集和传输的哪个项目,没办法,只好网上找找相关的项目,最终发现了mjpg-streamer...

基于mjpg-streamer网络视频服务器移植

MJPG简介:   MJPG是MJPEG的缩写,但是MJPEG还可以表示文件格式扩展名.   MJPEG   全名为 "Motion Joint Photographic Experts Gro...
  • wavemcu
  • wavemcu
  • 2012年05月06日 15:17
  • 6013

mjpg-stream的移植

MJPG简介:  MJPG是MJPEG的缩写,但是MJPEG还可以表示文件格式扩展名.   MJPEG   全名为 “Motion Joint Photographic Experts Group...
  • cqybhjz
  • cqybhjz
  • 2016年05月27日 15:35
  • 5739

MJPG-Streamer及使用---fwqlzz love is for ever

在zedboard上移植和搭建嵌入式网络摄像机mjpg-streamer。具体步骤如下: 来自:http://blog.csdn.net/xzyiverson/article/details/137...
  • fwqlzz
  • fwqlzz
  • 2016年04月20日 00:29
  • 1596

mjpg_streamer源码的分析及针对图像处理算法的修改

mjpg_streamer源码的分析及针对图像处理算法的修改   最近在研究mjpg_streamer,发现这是个好东西,关于mjpg_streamer就不做具体介绍了,总之它是在Linux上运...
  • yi412
  • yi412
  • 2014年07月10日 09:28
  • 2906

mjpg-streamer详解1

下载到源码包,解压缩后创建Source Insight工程方便分析: 在分析源代码前先将其中重要的结构体列出来,有了这些分析源码起来更方便: 首先搜索main函数来分析程序主体(在Mjpg_str...

mjpg-streamer详解3

之前已经分析了main函数,了解了整个程序的主体,然后分析了input_init函数和input_run函数,理清了输入渠道 本篇讲解剩下的output_init函数和output_run函数(即输...

mjpg-streamer学习笔记5----输入通道

input_uvc.c 1、input_init函数 int input_init(input_parameter *param) 设置默认参数 { char *argv[MAX_ARGUMENTS]...

mjpg-streamer详解2

之前已经分析了main函数,了解了整个程序的主体,最根本的就是那四个函数,接下来就开始继续分析这四个函数: 1、input_init(...)函数       一、首先是一些变量的初始化(后面会用到这...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mjpg-streamer学习笔记1----mjpg-streamer移植
举报原因:
原因补充:

(最多只允许输入30个字)