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

    浏览量

    20640
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    【ELF 1开发板试用】板载资源测试3:OV5640 摄像头测试

    飞凌嵌入式ELF1开发板(以下简称为“开发板”)底板设计了一个摄像头接口,正好手里边有一个OV5640摄像头,但由于没有扩展板,手里边也没有合适的LCD显示屏,因此,本期只做
    发表于 12-15 22:49

    【ELF 1开发板试用】+ 3.2 USB摄像头连接测试 + Ubutu SSH连接

    摄像头,后面会基于这个控制部件,来进行一个简单的开发控制; 未插上时USB总线状态: 插上设备后USB总线状态: 查看USB摄像头支持的分辨率和帧率: 这个功能非常有用,有时候做一些比如ESP32的
    发表于 12-06 15:37

    PaddlePi-K210开发板除了支持ov2640 ov5640摄像头外,还支持哪些摄像头作为外设?

    想问一下PaddlePi-K210开发板除了支持ov2640 ov5640摄像头外,还支持哪些摄像头作为外设?能否支持红外摄像头?谢谢!
    发表于 09-14 07:13

    米尔-STM32MP135开发板-入门级MPU试用】基于mjpg\\-streamer实时监控

    开发环境: 主机:Ubuntu 20.04 开发板MYD-YF135开发板 1 查看内核对USB摄像头 当插入UVC
    发表于 09-12 23:02

    【飞凌AM6254开发板试用】+3摄像头Linux驱动安装适配(原创)

    接上两篇:【飞凌AM6254开发板试用】+1控制小车(原创) - 飞凌嵌入式 - 电子技术论坛- 广受欢迎的专业电子论坛! https://bbs.elecfans.com
    发表于 09-12 16:33

    米尔-STM32MP135开发板-入门级MPU试用MYD-YF135开发板测评(一)

    MYD-YF135开发板基于STM32MP135处理器设计,STM32MP135基于单核 Cortex-A7 设计的高性价比,高可靠性工业级处理器; 配备LCD-TFT 并行显示接口、 16 位并行摄像头接口
    发表于 08-03 22:39

    0元试用!车规级国产芯驰D9开发板

    米尔与合作芯驰推出的新品基于D9系列应用处理器的MYC-JD9X核心板及开发板现已开放免费试用名额!!米尔准备了3块价值1199元的开发板
    的头像 发表于 07-06 10:07 551次阅读
    0元<b class='flag-5'>试用</b>!车规级国产芯驰D9<b class='flag-5'>开发板</b>

    米尔MYD-YG2开发板触摸屏测试

    米尔MYD-YG2开发板测试米尔触摸屏
    的头像 发表于 05-24 13:12 29.4w次阅读

    米尔MYD-JX8MMA7开发板-ARM+FPGA架构试用体验】九、QTDome大全

    ,并查看编译结果是否成功和编译后的输出路径。 最后将编译后的文件,复制到IMX8MMA7开发板上,然后运行其代码操作方法如下: 实际运行效果: 二、米尔开发板内例程 米尔科技
    发表于 05-23 09:21

    米尔MYD-JX8MMA7开发板-ARM+FPGA架构试用体验】 五、摄像头图像采集显示

    常见。其次是底层驱动不同:开发板内置CSI摄像头驱动,所以本文没有在格外安装它。但是USB摄像头驱动,尤其每个厂家的摄像头驱动都会有一点区别,所以本文在前面介绍了奥比中
    发表于 05-23 08:59

    有奖,免费开发板又双叒叕来了!米尔基于全志T113-S3开发板试用招募

    米尔再次与全志推出新品基于全志T113-S3应用处理器的MYC-YT113X核心板及开发板现已开放免费试用名额!!米尔准备了4块价值348元
    的头像 发表于 05-18 10:25 701次阅读
    有奖,免费<b class='flag-5'>开发板</b>又双叒叕来了!<b class='flag-5'>米尔</b>基于全志T113-S3<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>招募

    米尔瑞萨RZ/G2L开发板-试用体验】开箱

    感谢 感谢电子发烧友论坛、感谢米尔电子,把米尔瑞萨RZ/G2L开发板试用话动的机会给了我。虽然周五就收到了开发板,但是由于复阳了,为了能及时
    发表于 05-14 19:41