本文來(lái)源電子發(fā)燒友社區(qū),作者:HonestQiao, 帖子地址:https://bbs.elecfans.com/jishu_2294644_1_1.html
在之前的研究中,已經(jīng)實(shí)現(xiàn)了米爾MYD-YT507開(kāi)發(fā)板接入??低?/u>USB攝像頭,并進(jìn)行攝像頭數(shù)據(jù)的獲取,具體可查看:USB攝像頭使用從入門到放棄。
在此基礎(chǔ)上,進(jìn)一步實(shí)現(xiàn)了米爾MYD-YT507開(kāi)發(fā)提供MJPEG推流,矽速M(fèi)2 Dock讀取該MJPEG推流,并顯示到屏幕上,其邏輯如下:
最終的效果,可以查看:M2 Dock獲取MJPEG推流數(shù)據(jù)
這篇文章,分享的就是 米爾MYD-YT507開(kāi)發(fā)板 實(shí)現(xiàn)MJPEG推流的部分。
最開(kāi)始,我嘗試了使用nginx + nginx-rtmp-module
模塊,來(lái)實(shí)現(xiàn)rtmp視頻推流。
具體操作如下:
- 安裝nginx,及nginx-rtmp-module模塊:
# Ubuntu18.04操作系統(tǒng)
# 安裝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
-
使用ffmpeg獲取攝像頭數(shù)據(jù)并推流:
ffmpeg -input_format mjpeg -s:v 640x480 -framerate 30 -i /dev/video0 -f flv "rtmp://127.0.0.1:1935/live/test"
-
使用支持視頻流的播放器,播放流地址(注意IP修改為開(kāi)發(fā)板實(shí)際的IP):rtmp://192.168.1.207:1935/live/test
...
在矽速M(fèi)2 Dock上,使用的開(kāi)發(fā)環(huán)境是MaixPy。
在Python中,對(duì)于MJPEG數(shù)據(jù),可以很方便的獲取。
于是又了解了Ubuntu系統(tǒng)下MJPEG推流的資料,使用mjpeg_streamer就能很方便的實(shí)現(xiàn)。
具體操作如下:
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 ./"
執(zhí)行 mjpg_streamer 后,就會(huì)啟動(dòng)對(duì)應(yīng)的服務(wù):
然后,通過(guò)瀏覽器訪問(wèn) http://192.168.2.207:8080/?action=stream 即可:
提供的MJPEG服務(wù),可以用瀏覽器直接播放,也可以在Python程序中調(diào)用并呈現(xiàn)。
可供測(cè)試的代碼如下:
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() # 創(chuàng)建socket套接字
ret = client.connect((MJPEG_HOST, MJPEG_PORT)) # 狀態(tài)位,判定是否連接成功
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()) # 發(fā)送socket請(qǐng)求,開(kāi)始接收數(shù)據(jù)
chunk = client.recv(1024) # 第一個(gè)recv返回信息,跟圖片無(wú)關(guān)
chunk = client.recv(1024) # 這個(gè)信息開(kāi)始跟圖片有關(guān)系,放到接收變量里
while chunk: # 判斷是否還有信息
img_data_match(chunk)
chunk = client.recv(1024) # 繼續(xù)接收
在電腦上,將上述代碼保存為mjpeg_display_demo.py
,并修改代碼中MJPEG_HOST
為實(shí)際的開(kāi)發(fā)板ip地址,然后使用python mjpeg_display_demo.py
運(yùn)行,就能查看顯示了。
如果上述代碼運(yùn)行在矽速M(fèi)2 Dock中,那么對(duì)應(yīng)的效果就是顯示到屏幕上了。
-
米爾科技
+關(guān)注
關(guān)注
5文章
227瀏覽量
20957
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論