import time
import multiprocessing as mp
import threading
import cv2
from PIL import Image
import base64
import json
from io import BytesIO
import numpy as np
import requests
"""
Source: Yonv1943 2018-06-17
https://github.com/Yonv1943/Python
https://zhuanlan.zhihu.com/p/38136322
OpenCV official demo
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html
海康、大华IpCamera RTSP地址和格式(原创,旧版)- 2014年08月12日 23:01:18 xiejiashu
rtsp_path_hikvison = "rtsp://%s:%s@%s/h265/ch%s/main/av_stream" % (user, pwd, ip, channel)
rtsp_path_dahua = "rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel)
https://blog.csdn.net/xiejiashu/article/details/38523437
最新(2017)海康摄像机、NVR、流媒体服务器、回放取流RTSP地址规则说明 - 2017年05月13日 10:51:46 xiejiashu
rtsp_path_hikvison = "rtsp://%s:%s@%s//Streaming/Channels/%d" % (user, pwd, ip, channel)
https://blog.csdn.net/xiejiashu/article/details/71786187
"""
def image_put(q, rtsp):
cap = cv2.VideoCapture(rtsp)
while True:
q.put(cap.read()[1])
q.get() if q.qsize() > 1 else time.sleep(0.01)
def image_get(q, window_name):
cv2.namedWindow(window_name, flags=cv2.WINDOW_FREERATIO)
while True:
frame = q.get()
frame = process(frame);
# put_rtmp(frame, p)
cv2.imshow(window_name, frame)
cv2.waitKey(1)
def process(frame):
# frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
img = Image.fromarray(frame)
output_buffer = BytesIO() # 创建一个BytesIO
img.save(output_buffer, format='JPEG') # 写入output_buffer
byte_data = output_buffer.getvalue() # 在内存中读取
image_base64 = base64.b64encode(byte_data).decode() # 转为BASE64
data = json.dumps(
{"image": image_base64, "visual_result": "True", "username": "xsrt", "password": "dGVzdC1wd2QxMjM="})
headers = {"Content-Type": "application/json"}
response = requests.post('http://192.168.20.99:8190/fire/json', data=data, headers=headers)
# response = requests.post('http://192.168.20.99:8868/face_mask/json', data=data, headers=headers)
result = response.text
result = json.loads(result)
base64_img = None
img = None
try:
base64_img = result["base64"]
process_img = base64.b64decode(base64_img)
img = cv2.imdecode(np.frombuffer(process_img, np.uint8), cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
except:
img = frame
return img
def run_single_camera(rtsp):
# user_name, user_pwd, camera_ip = "admin", "admin123456", "[fe80::3aaf:29ff:fed3:d260]"
#
# mp.set_start_method(method='spawn') # init
# queue = mp.Queue(maxsize=2)
# processes = [mp.Process(target=image_put, args=(queue, user_name, user_pwd, camera_ip)),
# mp.Process(target=image_get, args=(queue, camera_ip))]
#
# [process.start() for process in processes]
# [process.join() for process in processes]
user_name, user_pwd, camera_ip = "admin", "admin123456", "[fe80::3aaf:29ff:fed3:d260]"
mp.set_start_method(method='spawn') # init
queue = mp.Queue(maxsize=2)
threads = [threading.Thread(target=image_put, args=(queue, rtsp)),
threading.Thread(target=image_get, args=(queue, 'fire'))]
[thread.start() for thread in threads]
def run(rtsp):
run_single_camera(rtsp) # quick, with 2 threads
pass
if __name__ == '__main__':
# rtsp = "rtsp://admin:[email protected]:554/h264/ch1/main/av_stream"
import sys
rtsp = sys.argv[1]
run(rtsp)
打包后生成 fire.exe
文件
参考 python打包
打包成 exe 文件后运行
# 后面的是参数:视频流地址
fire.exe rtsp://admin:[email protected]:554/h264/ch1/main/av_stream