如何移植视频流服务器

彭老师在录制的《物联网综合项目实战》课程中,在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 -lcrw-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 subversionsudo apt-get install libjpeg62-devsudo 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:重新编译前,需要执行
makesudo make install root@ubuntu:/home/peng/work/camera/mjpg-streamer/mjpg-streamer# make installinstall --mode=755 mjpg_streamer /usr/local/bininstall --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/wwwinstall --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 在 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 failed); }}fd_com = open (/tmp/webcom,o_rdonly,0666);if (fd_com = 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;   }  } } 在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;  }  


苹果将推出自研处理器的MacBook笔记本
小熊电器提升生活品质,消费需求增长趋势可观
区块链如何重构全新的世界
海信空调展现硬实力 要温度更要舒适度
如何将DS1862连接至集成APC环路的激光驱动器
如何移植视频流服务器
并联电子负载的注意事项及解决方案
“最后50米”配送智能化大势所趋,写字楼里机器人忙
无线通信为什么要用高频信号 为什么高频信号容易传输
RSAC2023解读第5期 | 威胁信息跨界协同,使能智能防御
MOORE型有限状态机的设计方案分析
苹果推出新款回收机器人Taz,华为与达闼机器人达成合作
AR物联网赋能工业4.0
阿尔法机器狗 走出国门的创新科技
简要说明如何进行PCB多层板设计
盟通科技与您相约成都工博会!
业务人员也能搭建企业应用?盘点对比这几款低代码开发平台
北极星探头的产品特点及其参数说明
1nm晶体管诞生 摩尔定律或将走到尽头了
发电机灭磁开关误跳闸的故障原因分析及处理