qiyun996
3 years ago
5 changed files with 109 additions and 113 deletions
@ -0,0 +1,48 @@ |
|||||
|
# -*- coding:utf-8 -*- |
||||
|
# @Time : 2021/12/31 16:17 |
||||
|
# @Author : lxc |
||||
|
# @File : tortsp.py |
||||
|
# https://github.com/aler9/rtsp-simple-server |
||||
|
|
||||
|
import cv2 |
||||
|
|
||||
|
|
||||
|
import subprocess as sp |
||||
|
import signal |
||||
|
import numpy as npbool |
||||
|
class RtstPushServer: |
||||
|
def __init__(self, fps=25,width=1080,height=960,rtsp='rtsp://192.168.1.182:8554/video'): |
||||
|
print('fps=',fps,' weitht=',width,' height=',height,' rtsp=',rtsp) |
||||
|
#此处换为你自己的地址 |
||||
|
self.lrtsp_url =rtsp |
||||
|
|
||||
|
# Get video information |
||||
|
self.lfps = fps |
||||
|
self.lwidth = width |
||||
|
self.lheight = height |
||||
|
self.command = ['ffmpeg', |
||||
|
'-y', |
||||
|
'-f', 'rawvideo', |
||||
|
'-vcodec', 'rawvideo', |
||||
|
'-pix_fmt', 'bgr24', |
||||
|
'-s', "{}x{}".format(self.lwidth, self.lheight), |
||||
|
'-r', str(self.lfps), |
||||
|
'-i', '-', |
||||
|
'-c:v', 'libx264', |
||||
|
# '-c:v', 'libx265', |
||||
|
'-pix_fmt', 'yuv420p', |
||||
|
'-preset', 'ultrafast', |
||||
|
'-f', 'rtsp', |
||||
|
self.lrtsp_url] |
||||
|
self.p = sp.Popen(self.command, stdin=sp.PIPE) |
||||
|
def write(self,frame): |
||||
|
|
||||
|
|
||||
|
if frame is None: |
||||
|
print("frame is None") |
||||
|
return |
||||
|
# frame = 你的图像处理的函数(frame) |
||||
|
self.p.stdin.write(frame.tostring()) |
||||
|
# cv2.imshow('img',frame) |
||||
|
# if cv2.waitKey(1) == ord('q'): # q to quit |
||||
|
# raise StopIteration |
@ -1,109 +1,47 @@ |
|||||
# -*- coding:utf-8 -*- |
# -*- coding:utf-8 -*- |
||||
# @Time : 2021/11/4 10:17 |
# @Time : 2021/12/3010:17 |
||||
# @Author : JulyLi |
# @Author : lxc |
||||
# @File : rtsp2.py |
# @File : tortsp.py |
||||
# @Software: PyCharm |
# https://github.com/aler9/rtsp-simple-server |
||||
|
|
||||
import cv2 |
import cv2 |
||||
import gi |
|
||||
import sys |
|
||||
import json |
|
||||
import time |
|
||||
import signal |
|
||||
import numpy as np |
|
||||
|
|
||||
gi.require_version('Gst', '1.0') |
|
||||
gi.require_version('GstRtspServer', '1.0') |
|
||||
from gi.repository import Gst, GstRtspServer, GObject |
|
||||
|
|
||||
#cv2.namedWindow('video_realtime_face', cv2.WINDOW_NORMAL) |
|
||||
|
|
||||
def to_node(type, message): |
|
||||
# convert to json and print (node helper will read from stdout) |
|
||||
try: |
|
||||
print(json.dumps({type: message})) |
|
||||
except Exception: |
|
||||
pass |
|
||||
# stdout has to be flushed manually to prevent delays in the node helper communication |
|
||||
sys.stdout.flush() |
|
||||
|
|
||||
to_node("status", "Facerecognition started...") |
|
||||
|
|
||||
def shutdown(self, signum): |
|
||||
to_node("status", 'Shutdown: Cleaning up camera...') |
|
||||
quit() |
|
||||
|
|
||||
signal.signal(signal.SIGINT, shutdown) |
|
||||
|
|
||||
|
|
||||
class SensorFactory(GstRtspServer.RTSPMediaFactory): |
|
||||
def __init__(self, **properties): |
|
||||
super(SensorFactory, self).__init__(**properties) |
|
||||
self.cap = cv2.VideoCapture("rtsp://admin:admin123@192.168.2.190:554/sub") |
|
||||
# self.cap = cv2.VideoCapture("shmsrc socket-path=/tmp/foo2 ! video/x-raw, format=BGR ,width=1920,height=1080,framerate=30/1 ! videoconvert ! video/x-raw, format=BGR ! appsink") |
|
||||
#self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) |
|
||||
#self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) |
|
||||
self.number_frames = 0 |
|
||||
self.fps = 30.0 |
|
||||
self.duration = 1 / self.fps * Gst.SECOND # duration of a frame in nanoseconds |
|
||||
self.launch_string = 'appsrc name=source is-live=true block=true format=GST_FORMAT_TIME ' \ |
|
||||
'caps=video/x-raw,format=BGR,width=1920,height=1080,framerate=30/1 ' \ |
|
||||
'! videoconvert ! video/x-raw,format=I420 ' \ |
|
||||
'! x264enc speed-preset=ultrafast tune=zerolatency threads=4 ' \ |
|
||||
'! rtph264pay config-interval=1 name=pay0 pt=96' |
|
||||
|
|
||||
def on_need_data(self, src, lenght): |
|
||||
if self.cap.isOpened(): |
|
||||
ret, frame = self.cap.read() |
|
||||
if ret: |
|
||||
#cv2.imshow("video_realtime_face", frame) |
|
||||
#if cv2.waitKey(1) & 0xFF == ord('q'): |
|
||||
# return |
|
||||
data = frame.tostring() |
|
||||
buf = Gst.Buffer.new_allocate(None, len(data), None) |
|
||||
buf.fill(0, data) |
|
||||
buf.duration = self.duration |
|
||||
timestamp = self.number_frames * self.duration |
|
||||
buf.pts = buf.dts = int(timestamp) |
|
||||
buf.offset = timestamp |
|
||||
self.number_frames += 1 |
|
||||
retval = src.emit('push-buffer', buf) |
|
||||
print('pushed buffer, frame {}, duration {} ns, durations {} s'.format(self.number_frames, |
|
||||
self.duration, |
|
||||
self.duration / Gst.SECOND)) |
|
||||
if retval != Gst.FlowReturn.OK: |
|
||||
print(retval) |
|
||||
|
|
||||
def do_create_element(self, url): |
|
||||
return Gst.parse_launch(self.launch_string) |
|
||||
|
|
||||
def do_configure(self, rtsp_media): |
|
||||
self.number_frames = 0 |
|
||||
appsrc = rtsp_media.get_element().get_child_by_name('source') |
|
||||
appsrc.connect('need-data', self.on_need_data) |
|
||||
|
|
||||
|
|
||||
class GstServer(GstRtspServer.RTSPServer): |
|
||||
def __init__(self, **properties): |
|
||||
super(GstServer, self).__init__(**properties) |
|
||||
self.factory = SensorFactory() |
|
||||
self.factory.set_shared(True) |
|
||||
self.get_mount_points().add_factory("/test", self.factory) |
|
||||
self.attach(None) |
|
||||
|
|
||||
|
|
||||
def run(): |
|
||||
GObject.threads_init() |
|
||||
Gst.init(None) |
|
||||
|
|
||||
server = GstServer() |
|
||||
rtsp_port_num = 8554 |
|
||||
print("\n *** DeepStream: Launched RTSP Streaming at rtsp://localhost:%d/test ***\n\n" % rtsp_port_num) |
|
||||
loop = GObject.MainLoop() |
|
||||
loop.run() |
|
||||
|
|
||||
|
|
||||
|
|
||||
if __name__ == "__main__": |
|
||||
run() |
|
||||
|
|
||||
|
import subprocess as sp |
||||
|
import signal |
||||
|
import numpy as npbool |
||||
|
#此处换为你自己的地址 |
||||
|
rtsp_url = 'rtsp://192.168.1.182:8554/video' |
||||
|
cap = cv2.VideoCapture("rtsp://admin:hk123456@192.168.1.65:554") |
||||
|
# Get video information |
||||
|
fps = int(cap.get(cv2.CAP_PROP_FPS)) |
||||
|
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |
||||
|
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
||||
|
command = ['ffmpeg', |
||||
|
'-y', |
||||
|
'-f', 'rawvideo', |
||||
|
'-vcodec', 'rawvideo', |
||||
|
'-pix_fmt', 'bgr24', |
||||
|
'-s', "{}x{}".format(width, height), |
||||
|
'-r', str(fps), |
||||
|
'-i', '-', |
||||
|
# '-c:v', 'libx264', |
||||
|
'-c:v', 'libx265', |
||||
|
'-pix_fmt', 'yuv420p', |
||||
|
'-preset', 'ultrafast', |
||||
|
'-f', 'rtsp', |
||||
|
rtsp_url] |
||||
|
p = sp.Popen(command, stdin=sp.PIPE) |
||||
|
|
||||
|
while (cap.isOpened()): |
||||
|
ret, frame = cap.read() |
||||
|
frame=cv2.resize(frame,(1080,640)) |
||||
|
|
||||
|
if not ret: |
||||
|
print("Opening camera is failed") |
||||
|
break |
||||
|
# frame = 你的图像处理的函数(frame) |
||||
|
p.stdin.write(frame.tostring()) |
||||
|
# cv2.imshow('img',frame) |
||||
|
# if cv2.waitKey(1) == ord('q'): # q to quit |
||||
|
# raise StopIteration |
||||
|
Loading…
Reference in new issue