前言:环境配置真痛苦,docker度你不迷糊!

参考网站:https://hub.docker.com/r/migoller/shinobidocker

 

主机系统:ubuntu16.04

配置目的:利用Shinobi组建局域网监控平台

所需软件:docker、Shinobi、ffserver

 

1.Shinobi配置(docker)

1.1 docker一键pull镜像

docker pull migoller/shinobidocker

1.2 按照网站中的步骤完成以下部分,其余部分忽略

Dock the "microservice" Shinobi Docker image

  • 创建Shinobi目录[Path to Shinobi direcory]及其子目录:
mkdir -p [Path to Shinobi direcory]/config [Path to Shinobi direcory]/datadir [Path to Shinobi direcory]/videos
  •  Shinobi目录下创建一个文件docker-compose.yml,内容如下:
 version: '2'
 services:
   db:
     image: mariadb
     env_file:
       - MySQL.env
     volumes:
       - ./datadir:/var/lib/mysql
   shinobi:
     image: migoller/shinobidocker:microservice-debian
     env_file:
       - MySQL.env
       - Shinobi.env
     volumes:
       - /etc/localtime:/etc/localtime:ro
       - /etc/timezone:/etc/timezone:ro
       - ./config:/config
       - ./videos:/opt/shinobi/videos
       - /dev/shm/shinobiDockerTemp:/dev/shm/streams
     ports:
       - "8080:8080"
  • Shinobi目录下创建MySQL.env文件:
 MYSQL_USER=majesticflame
 MYSQL_PASSWORD=password
 MYSQL_HOST=db
 MYSQL_DATABASE=ccio
 MYSQL_ROOT_PASSWORD=blubsblawoot
 MYSQL_ROOT_USER=root
  • Shinobi目录下创建Shinobi.env文件:
 ADMIN_USER=admin@shinobi.video
 ADMIN_PASSWORD=admin
 CRON_KEY=b59b5c62-57d0-4cd1-b068-a55e5222786f
 PLUGINKEY_MOTION=49ad732d-1a4f-4931-8ab8-d74ff56dac57
 PLUGINKEY_OPENCV=6aa3487d-c613-457e-bba2-1deca10b7f5d
 PLUGINKEY_OPENALPR=SomeOpenALPRkeySoPeopleDontMessWithYourShinobi
 MOTION_HOST=localhost
 MOTION_PORT=8080
  • 后台启动Shinobi stack:(关闭可以用sudo docker-compose down)
sudo docker-compose up -d
  • 运行mariadb:(YourMariaDbContainerName可以随便写,但是后面步骤必须与其一致;Shinobi目录下新建一个文件夹[Path to your MariaDB server data files];[Your very strong MariaDB root password]可以随便写,但一定要记住。)
docker run -d --name [YourMariaDbContainerName] -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro -v [Path to your MariaDB server data files]:/var/lib/mysql    -e MYSQL_ROOT_PASSWORD=[Your very strong MariaDB root password] -p 3306:3306 mariadb
  • 运行Shinobi:(YourMariaDbContainerName与上一步相同)
docker run -d --link [YourMariaDbContainerName]:db -p 8080:8080 -e ADMIN_USER=admin@shinobi.video -e ADMIN_PASSWORD=admin -e MYSQL_USER=majesticflame -e MYSQL_PASSWORD=password -e MYSQL_HOST=db -e MYSQL_DATABASE=ccio -e MYSQL_ROOT_PASSWORD=[Your very strong MariaDB root password] -e MYSQL_ROOT_USER=[Your MariaDB root username]      -e CRON_KEY=b59b5c62-57d0-4cd1-b068-a55e5222786f -e PLUGINKEY_MOTION=49ad732d-1a4f-4931-8ab8-d74ff56dac57 -e PLUGINKEY_OPENCV=6aa3487d-c613-457e-bba2-1deca10b7f5d -e PLUGINKEY_OPENALPR=SomeOpenALPRkeySoPeopleDontMessWithYourShinobi -e MOTION_HOST=localhost      -e MOTION_PORT=8080 -v /etc/localtime:/etc/localtime:ro -v /etc/timezone:/etc/timezone:ro      -v [Path to your Shinobi data files]/config:/config -v [Path to your Shinobi data files]/datadir:/var/lib/mysql -v [Path to your Shinobi data files]/videos:/opt/shinobi/videos -v /dev/shm/shinobiDockerTemp:/dev/shm/streams      migoller/shinobidocker:microservice-debian
  • 浏览器登录:(xxx.xxx.xxx.xxx就是主机IP地址)
Web Address : http://xxx.xxx.xxx.xxx:8080/super
Username : admin@shinobi.video
Password : admin
  • 创建自己的账户,以后可直接登录自己的账户:
http://xxx.xxx.xxx.xxx:8080/

2.流媒体推送usb摄像头

配置流媒体服务,ffmpeg将usb摄像头获取的图像信息推送至局域网中的流媒体服务器(ffserver),局域网中其他用户可用rtsp的方式获取usb摄像头的图像流。

对于ffmpeg的流媒体推送理解:https://blog.csdn.net/zouli415/article/details/79652749

ffserver和ffmpeg配置:https://blog.csdn.net/zong596568821xp/article/details/88540455

运行ffserver:

 sudo ffserver -f /etc/ffserver.conf

运行ffmpeg:

sudo ffmpeg -f v4l2 -i /dev/video0 -s 640x480 -r 24 -vcodec libx264 -an http://127.0.0.1:8090/feed1.ffm

Shinobi服务器查看:

填写rtsp地址,Full URL PathThe full Stream URL.

选择查看流类型:

3.流媒体推送IntelRealSenseD435

参考网站1:https://blog.csdn.net/dieju8330/article/details/85420584

参考网站2:https://github.com/lam2003/v4l2_webstream_server/tree/f64a1f9429c74a110c57f519ac8658057203ca14

吐槽一下:

  • 光是一个usb摄像头要实现流媒体服务推送rtsp流(C++编程),就已经很麻烦了。IntelRealSenseD435是3个摄像头,需要用到librealsense SDK,所以就更加难搞,只能学习网站给的程序,搞个野路子!!!
  • 网站1网站2虽然给出了代码,但是librealsense、x264、FFmpeg、live555、都需要自己编译,所以还是需要一定的编译基础的!

野路子思路:

  • 获取:运用opencv正常读取IntelRealSenseD435深度图像,并保存为一个临时图片temp.jpg;
  • 编码:用FFmpeg+x264实现对temp.jpg的编码,编码为H264数据流;
  • 传输:用live555实现rtsp流服务,传输编码的H264数据流。

调试内容:

Intel RealSense D435的深度图为16bit-depth,RGB图为8bit-depth。

同时,用Intel RealSense D435采集640*480大小的图像,深度图采用CV_16U格式,RGB图采用CV_8UC3格式。

/*深度图*/
Mat depth_image(Size(depth_w,depth_h),
                             CV_16U,(void*)depth_frame.get_data(),Mat::AUTO_STEP);
/*RGB图*/
Mat color_image(Size(color_w,color_h),
                             CV_8UC3,(void*)color_frame.get_data(),Mat::AUTO_STEP);

gdb调试时可以看到,深度图dims=2, rows=480, cols=640, step[0]=1280,step[1]=2,RGB图dims=2, rows=480, cols=640, step[0]=1920,step[1]=3。(step[0]是矩阵中一行元素的字节数;step[1]是矩阵中一个元素的字节数),即深度图每一个元素都占用了2个字节存储,RGB图每个元素都占用的3字节存储(分别存储各通道数据)。

C++: int Mat::depth() const
The method returns the identifier of the matrix element depth (the type of each individual channel). For example, for a 16-bit signed element array, the method returns CV_16S . A complete list of matrix types contains the following values:

CV_8U - 8-bit unsigned integers ( 0..255 )
CV_8S - 8-bit signed integers ( -128..127 )
CV_16U - 16-bit unsigned integers ( 0..65535 )
CV_16S - 16-bit signed integers ( -32768..32767 )
CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐