0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【米尔MYD-YT507开发板试用体验】使用mjpeg_streamer建立摄像头图传

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-10-26 15:18 次阅读

本文来源电子发烧友社区,作者:HonestQiao, 帖子地址:https://bbs.elecfans.com/jishu_2294644_1_1.html


在之前的研究中,已经实现了米尔MYD-YT507开发板接入海康威视USB摄像头,并进行摄像头数据的获取,具体可查看:USB摄像头使用从入门到放弃

在此基础上,进一步实现了米尔MYD-YT507开发提供MJPEG推流,矽速M2 Dock读取该MJPEG推流,并显示到屏幕上,其逻辑如下:
M2Dock推流数据获取逻辑.png

最终的效果,可以查看:M2 Dock获取MJPEG推流数据

这篇文章,分享的就是 米尔MYD-YT507开发板 实现MJPEG推流的部分。

最开始,我尝试了使用nginx + nginx-rtmp-module模块,来实现rtmp视频推流。

具体操作如下:

  1. 安装nginx,及nginx-rtmp-module模块:
# Ubuntu18.04操作系统
# 安装pcre

sudo apt install libpcre3 libpcre3-dev
sudo apt install openssl libssl-dev
sudo apt install zlib1g-dev

# 安装nginx
wget http://nginx.org/download/nginx-1.22.0.tar.gz
git git clone https://github.com/arut/nginx-rtmp-module
tar -zxvf nginx-1.22.0.tar.gz
cd nginx-1.22.0
./configure --prefix=/usr/local/nginx  --add-module=../nginx-rtmp-module  --with-http_ssl_module
make -j4
sudo make install
  1. 使用ffmpeg获取摄像头数据并推流:

    ffmpeg -input_format mjpeg -s:v 640x480 -framerate 30 -i /dev/video0 -f flv "rtmp://127.0.0.1:1935/live/test"
    
  2. 使用支持视频流的播放器,播放流地址(注意IP修改为开发板实际的IP):rtmp://192.168.1.207:1935/live/test
    ...

在矽速M2 Dock上,使用的开发环境是MaixPy。
Python中,对于MJPEG数据,可以很方便的获取。
于是又了解了Ubuntu系统下MJPEG推流的资料,使用mjpeg_streamer就能很方便的实现。

具体操作如下:

sudo apt install cmake libjpeg9-dev

git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make all
sudo make install

mjpg_streamer -i "input_uvc.so -d /dev/video0 -n -r 320x240 -f 10" -o "output_http.so -w ./"

执行 mjpg_streamer 后,就会启动对应的服务:
image.png

然后,通过浏览器访问 http://192.168.2.207:8080/?action=stream 即可:
image.png

提供的MJPEG服务,可以用浏览器直接播放,也可以在Python程序中调用并呈现。
可供测试的代码如下:

import numpy as np
import platform

if platform.uname().node == "sipeed":
    from io import BytesIO
    from PIL import Image
    from maix import camera, mjpg, utils, display, image
else:
    import cv2

READ_TYPE = "socket"    # url socket

MJPEG_HOST = "192.168.2.207"
MJPEG_PORT = 8080
MJPEG_QUERY = "/?action=stream"


def img_data_show(jpg):
    global img_bytes
    global tmp_file
    global is_sipeed
    global BytesIO
    global Image
    global np
    global image
    global display

    if is_sipeed:
        if True:
            bytes_stream = BytesIO(jpg)
            pimg = Image.open(bytes_stream)
            img = image.load(pimg)
            display.show(img)
        else:
            with open(tmp_file, "wb") as binary_file:
                binary_file.write(jpg)
                img = image.open(tmp_file)
                display.show(img)
    else:
        img = cv2.imdecode(np.frombuffer(
            jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
        cv2.imshow('i', img)
        if cv2.waitKey(1) == 27:
            exit(0)


def img_data_match(chunk):
    global img_bytes
    global tmp_file
    global is_sipeed
    global BytesIO
    global Image
    global np
    global image
    global display
    global img_data_show

    img_bytes += chunk
    a = img_bytes.find(b'xffxd8')
    b = img_bytes.find(b'xffxd9')
    if a != -1 and b != -1:
        jpg = img_bytes[a:b+2]
        img_bytes = img_bytes[b+2:]
        img_data_show(jpg)     


img_bytes = b''
tmp_file = "/tmp/test.jpg"
is_sipeed = platform.uname().node == "sipeed"

print("Connect to %s:%d with %s on %s" % (MJPEG_HOST, MJPEG_PORT, READ_TYPE, platform.uname().node))

if READ_TYPE == "url":
    import requests

    MJPEG_URL = "http://%s:%s%s" % (MJPEG_HOST, MJPEG_PORT, MJPEG_QUERY)

    r = requests.get(MJPEG_URL, stream=True)
    if(r.status_code == 200):
        print("connect success!")
        for chunk in r.iter_content(chunk_size=1024):
            img_data_match(chunk)
    else:
        print("Received unexpected status code {}".format(r.status_code))
elif READ_TYPE == "socket":
    import socket

    client = socket.socket()  # 创建socket套接字
    ret = client.connect((MJPEG_HOST, MJPEG_PORT))  # 状态位,判定是否连接成功
    request_url = "GET %s HTTP/1.1rnHost:%srnConnection:Closernrn" % (
        MJPEG_QUERY, MJPEG_HOST)

    if(ret == -1):  # 连接失败,退出程序
        print("connet error!")
        exit(-1)
    else:  # 连接成功
        print("connect success!")

    client.send(request_url.encode())  # 发送socket请求,开始接收数据
    chunk = client.recv(1024)  # 第一个recv返回信息,跟图片无关
    chunk = client.recv(1024)  # 这个信息开始跟图片有关系,放到接收变量里
    while chunk:  # 判断是否还有信息
        img_data_match(chunk)
        chunk = client.recv(1024)  # 继续接收

电脑上,将上述代码保存为mjpeg_display_demo.py,并修改代码中MJPEG_HOST为实际的开发板ip地址,然后使用python mjpeg_display_demo.py运行,就能查看显示了。

如果上述代码运行在矽速M2 Dock中,那么对应的效果就是显示到屏幕上了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 米尔科技
    +关注

    关注

    5

    文章

    227

    浏览量

    20957
收藏 人收藏

    评论

    相关推荐

    人脸疲劳检测应用-米尔基于RK3576核心/开发板

    本文将介绍基于米尔电子MYD-LR3576开发板米尔基于瑞芯微RK3576开发板)的人脸疲劳检测方案测试。
    的头像 发表于 12-20 08:06 130次阅读
    人脸疲劳检测应用-<b class='flag-5'>米尔</b>基于RK3576核心<b class='flag-5'>板</b>/<b class='flag-5'>开发板</b>

    如何用OpenCV进行手势识别--基于米尔全志T527开发板

    本文将介绍基于米尔电子MYD-LT527开发板米尔基于全志T527开发板)的OpenCV手势识别方案测试。摘自优秀创作者-小火苗
    的头像 发表于 12-13 08:04 608次阅读
    如何用OpenCV进行手势识别--基于<b class='flag-5'>米尔</b>全志T527<b class='flag-5'>开发板</b>

    追加名额丨米尔瑞芯微RK3576开发板有奖试用

    米尔与瑞芯微合作发布的新品基于瑞芯微RK3576应用处理器的MYD-LR3576开发板免费试用活动加码啦~~米尔追加了2块价值849元的
    的头像 发表于 11-22 01:00 167次阅读
    追加名额丨<b class='flag-5'>米尔</b>瑞芯微RK3576<b class='flag-5'>开发板</b>有奖<b class='flag-5'>试用</b>

    米尔-Xilinx XC7A100T FPGA开发板试用】+01.开箱(zmj)

    米尔-Xilinx XC7A100T FPGA开发板试用】+01.开箱(zmj) 1.感谢 感谢米尔电子和电子发烧友提供的此次试用机会,可
    发表于 11-12 15:45

    有奖丨米尔 瑞芯微RK3576开发板免费试用

    米尔与瑞芯微合作发布的新品基于瑞芯微RK3576应用处理器的MYD-LR3576开发板免费试用活动来啦~~米尔提供了7块价值849元的
    的头像 发表于 11-12 01:00 301次阅读
    有奖丨<b class='flag-5'>米尔</b> 瑞芯微RK3576<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>

    基于OPENCV的相机捕捉视频进行人脸检测--米尔NXP i.MX93开发板

    本文将介绍基于米尔电子MYD-LMX93开发板米尔基于NXPi.MX93开发板)的基于OpenCV的人脸检测方案测试。OpenCV提供了一
    的头像 发表于 11-07 09:03 1081次阅读
    基于OPENCV的相机捕捉视频进行人脸检测--<b class='flag-5'>米尔</b>NXP i.MX93<b class='flag-5'>开发板</b>

    【飞凌嵌入式OK3576-C开发板体验】 USB摄像头拍照测试

    USB摄像头拍照 将 USB 摄像头插入开发板,将自动安装 uvc 驱动 使用命令查看usb摄像头,已经将USB摄像头插入到板子上。命令:v
    发表于 10-10 09:24

    点击参与米尔NXP i.MX 93开发板有奖试用

    米尔与NXP合作发布的新品基于NXPi.MX93应用处理器的MYD-LMX9X开发板免费试用活动来啦~~米尔提供了3块价值678元的
    的头像 发表于 06-13 08:02 523次阅读
    点击参与<b class='flag-5'>米尔</b>NXP i.MX 93<b class='flag-5'>开发板</b>有奖<b class='flag-5'>试用</b>

    米尔NXP i.MX 93开发板的Qt开发指南

    1.概述Qt是一个跨平台的图形应用开发框架,被应用在不同尺寸设备和平台上,同时提供不同版权版本供用户选择。米尔NXPi.MX93开发板MYD-LMX9X
    的头像 发表于 06-07 08:01 1730次阅读
    <b class='flag-5'>米尔</b>NXP i.MX 93<b class='flag-5'>开发板</b>的Qt<b class='flag-5'>开发</b>指南

    免费!NXP i.MX 93开发板有奖试用

    米尔与NXP合作发布的新品基于NXPi.MX93应用处理器的MYD-LMX9X开发板免费试用活动来啦~~米尔提供了2块价值678
    的头像 发表于 05-23 08:01 722次阅读
    免费!NXP i.MX 93<b class='flag-5'>开发板</b>有奖<b class='flag-5'>试用</b>

    米尔-芯驰D9360商显试用评测】USB摄像头测试

    零、前期工作 上文FFmpeg移植完成后,需要将x264/lib文件夹下的库文件拷贝到开发板的/lib/目录下,将ffmpeg_install/lib文件夹下的库文件全部拷贝到开发板的/lib/目录
    发表于 04-17 19:03

    G2D图像处理硬件调用和测试-基于米尔-全志T113-i开发板

    本篇测评由电子工程世界的优秀测评者“jf_99374259”提供。本文将介绍基于米尔电子MYD-YT113i开发板的G2D图像处理硬件调用和测试。MYC-YT113i核心
    的头像 发表于 04-12 08:01 664次阅读
    G2D图像处理硬件调用和测试-基于<b class='flag-5'>米尔</b>-全志T113-i<b class='flag-5'>开发板</b>

    米尔-芯驰D9360商显试用评测】成功解决QCamera的模块调用,并编写简单的查找摄像头程序

    ; cameraInfo.orientation(); } 8、编译好后,把程序上传给开发板,插入USB摄像头,执行程序,就可以找到了摄像头了:
    发表于 04-07 18:12

    ROS系统的智能车开发-基于米尔芯驰MYD-JD9X开发板

    本篇测评由电子工程世界的优秀测评者“mameng”提供。本文将介绍基于米尔电子MYD-JD9X开发板的ROS系统智能车开发。目前实现ROS的方式主要有两种:Ubuntu系统+ROS;U
    的头像 发表于 01-26 08:01 919次阅读
    ROS系统的智能车<b class='flag-5'>开发</b>-基于<b class='flag-5'>米尔</b>芯驰<b class='flag-5'>MYD</b>-JD9X<b class='flag-5'>开发板</b>