加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、嵌入式视频图像开源库
    • 二、mjpg-streamer简介
    • 三、测试摄像头
    • 四、移植
    • 五、代码流程
    • 六、支持单拍、连拍
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

嵌入式 | 手把手教你ubuntu下移植MJPG-streamer

2022/07/26
1880
阅读需 13 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

彭老师在录制的《物联网综合项目实战》课程中,在web页面中加入了实时监控摄像头的功能,特地整理了一篇如何移植视频流服务器的文章,供大家学习。

一、嵌入式视频图像开源库

嵌入式系统中,常用的视频图像处理开源系统有:luvcview、cheese、motion、mjpg-streamer或者ffmpeg,其中:

• luvcview: 基于V4L2、SDL的程序,支持拍照录像,参数调节,代码精简实用,适合学习V4L2编程

• cheese:基于V4L2、GTK的程序,支持拍照录像,特殊视频效果

• motion:移动侦测拍照程序

• mjpg-streamer:网络摄像机程序

 

二、mjpg-streamer简介

MJPG-streamer是一个优秀的开源project,它可以通过HTTP的方式访问linux上面的兼容摄像头,从而做到远程视频传输的效果。

MJPG-streamer从webcam摄像头采集图像,把他们以流的形式通过基于ip的网络传输到浏览器如Firehox,Cambozola,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备。

它可以利用某些webcams的硬件压缩功能来降低服务器CPU的开销。

它为嵌入式设备和一些常规服务器提供了一个轻量且更少CPU消耗的方案,因为它无需为视频帧压缩浪费大量的计算效率。

三、测试摄像头

1)按上图的方式将罗技摄像头连接入虚拟机

2)下载安装cheese 检测摄像头是否能够正常工作

$ sudo apt-get update
$ sudo apt-get install cheese

ubuntu 16.04已经自带该程序

3)测试

摄像头连接后会生成以下设备文件

root@ubuntu:/home/peng/work# ls /dev/video0 -l
crw-rw----+ 1 root video 81, 0 Mar 25 07:18 /dev/video0

运行

root@ubuntu:/home/peng/work# cheese 

 

 

四、移植

安装准备:

1. 安装前准备

sudo apt-get install libsdl1.2-dev subversion
sudo apt-get install libjpeg62-dev
sudo apt-get install imagemagick
 

2. 下载mjpeg-streamer

git clone https://github.com/shrkey/mjpg-streamer

如果没有安装git,执行以下命令

sudo apt-get install git

 

3. 编译安装

cd mjpg-streamer/mjpg-streamer

 

 

root@ubuntu:/home/peng/work/camera/mjpg-streamer# tree -L 1 ./
./
├── doc
├── mjpeg-client     #分别有 linux和windows 的客户端
├── mjpg-streamer    #目录下提供了 的执行程序和各个输入输出设备组件
├── mjpg-streamer-experimental
├── mjpg-streamer.tar.gz
├── README.md
├── udp_client
└── uvc-streamer     #目录下提供了 uvc-streamer的可执行目录

6 directories, 2 files

ps:重新编译前,需要执行

make
sudo make install
root@ubuntu:/home/peng/work/camera/mjpg-streamer/mjpg-streamer# make install
install --mode=755 mjpg_streamer /usr/local/bin
install --mode=644 input_uvc.so output_file.so output_udp.so output_http.so input_testpicture.so input_file.so /usr/local/lib/
install --mode=755 -d /usr/local/www
install --mode=644 -D www/* /usr/local/www

编译生成的库文件功能

(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图像存储到特定的文件夹下,它可以用来抓取图像。

4 修改脚本

修改脚本文件

/home/peng/work/camera/mjpg-streamer/mjpg-streamer/start.sh
./mjpg_streamer -i "./input_uvc.so -y" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 15000"

 

"./input_uvc.so -y" :指定摄像头是YUV,默认是JPEG,一口君使用的罗技摄像头是YUV
"./output_http.so -w ./www" :指定web服务器根目录./www,我们可以通过浏览器测试摄像头
"./output_file.so -f /www/pice -d 15000" : 指定拍照保存照片目录/www/pice,并且每15s保存一次照片

也可以指定分辨率:

./mjpg_streamer -i "input_uvc.so -d /dev/video0 -n -y -r 640x480 -f 30" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 15000"

市面上有的摄像头支持格式有YUV,MJPEG,H264 ;mjpg-stream支持MJPEG和YUV两种格式

5 测试

运行

./start.sh

(1)网页测试

(2)网页视频流测试

(3) 拍照功能实现

浏览器上地址栏输入如下内容:

http://127.0.0.1:8080/?action=snapshot

或者

http://127.0.0.1:8080/?action=stream

snapshot 表示每次抓拍一张图形显示在网页上,stream 表示视频流也就是连续的图 像

6. 补充

一口君还使用了一款z-star摄像头,该款摄像头不要添加-y选项

./mjpg_streamer -i "./input_uvc.so  -d /dev/video0" -o "./output_http.so -w ./www" -o "./output_file.so -f /www/pice -d 150000"

有时候摄像头生成的设备文件不是/dev/video0

我们需要对应参数:

-d /dev/video1

五、代码流程

 

六、支持单拍、连拍

由于 mjpg_stream 中 output-file.so 能实现连续拍照的功能,不能实现单拍或 连拍几张的功能所以需要对 output_file 原码进行修改。修改文件目录:

peng@ubuntu:~/work/camera/mjpg-streamer/mjpg-streamer/plugins/output_file/output_file.c
  1. 在 196 行 函数 voidworker_thread(voidarg) 体中加入以下代码:
char buf[10];   //用于存放从管道读取的命令
int flags = 0;   //拍照标志,1:表示11张照片,2:表示1张照片
int fd_com = 0; //打开管道的文件描述符

int stop_num = 0; //拍照计数

if ( access("/tmp/webcom",F_OK) < 0 )    //创建有名管道用于接收拍照命令
{
 if ( mkfifo("/tmp/webcom",0666 ) < 0)
 {
  printf("photo fifo create failedn");
 }
}

fd_com = open ("/tmp/webcom",O_RDONLY,0666);
if (fd_com < 0)
{
 perror ("open the file webcom error");
}
  1. 在229行 while( ok >= 0 && !pglobal->stop){ 后加入
if (flags == 0)
 {
  while(1)
  {
   read(fd_com,buf,sizeof(buf));
   if (strncmp(buf,"danger",6) == 0)    //拍11张照片
   {
    flags = 1;
    bzero(buf,sizeof(buf));
    break;
   }

   if (strncmp(buf,"one",3) == 0)   //拍1张照片
   {
    flags = 2;
    bzero(buf,sizeof(buf));
    break;
   }
  }
 }
  1. 在355行
355         /* if specified, wait now */
356         if(delay > 0) {
357             usleep(1000 * delay);
358         }

后加入

  stop_num++;
  if (flags == 1)        //判断拍照的数量
  {
   if  ( stop_num > 9)
   {
    stop_num = 0;
    flags = 0;
   }
  }
  else if (flags == 2)
  {
   stop_num = 0;
   flags = 0;
  }

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
SN74LVC1G17DCKR 1 Texas Instruments Single 1.65-V to 5.5-V buffer with Schmitt-Trigger inputs 5-SC70 -40 to 125

ECAD模型

下载ECAD模型
$0.38 查看
VSC8572XKS-05 1 Microchip Technology Inc Ethernet Transceiver
$263.97 查看
CNY65B 1 Telefunken Semiconductor GmbH & Co Kg Transistor Output Optocoupler, 1-Element, 12000V Isolation,
$1.17 查看
Ubuntu

Ubuntu

Ubuntu is the modern, open source operating system on Linux for the enterprise server, desktop, cloud, and IoT.

Ubuntu is the modern, open source operating system on Linux for the enterprise server, desktop, cloud, and IoT.收起

查看更多

相关推荐

电子产业图谱

公众号『一口Linux』号主彭老师,拥有15年嵌入式开发经验和培训经验。曾任职ZTE,某研究所,华清远见教学总监。拥有多篇网络协议相关专利和软件著作。精通计算机网络、Linux系统编程、ARM、Linux驱动、龙芯、物联网。原创内容基本从实际项目出发,保持原理+实践风格,适合Linux驱动新手入门和技术进阶。