我想写一个程序,通过多播或广播的rtsp/tsp服务器流cv 2帧。
我写了一个代码下面的一些例子,但这个代码我只能流使用第一个客户端和所有其他客户端后,运行第一不能得到图像流(测试ffplay和vlc,url是rtsp://host_url:5000/stream
)。
这段代码中有什么需要改进的地方吗?
我认为第一个客户端接收所有发出的块.
class SensorFactory(GstRtspServer.RTSPMediaFactory):
def __init__(self, image_type):
super(SensorFactory, self).__init__()
self.number_frames = 0
self.fps = 30.0
self.duration = 1.0 / self.fps * Gst.SECOND # duration of a frame in gst units
self.launch_string = 'appsrc name=source is-live=true format=GST_FORMAT_TIME ' \
'caps=video/x-raw,format=BGR,width=640,height=360,framerate=30/1 ' \
'! videoconvert ! video/x-raw,format=I420 ' \
'! x264enc speed-preset=ultrafast tune=zerolatency ' \
'! rtph264pay name=pay0 pt=96'
self.image_type = image_type
def do_create_element(self, url):
return Gst.parse_launch(self.launch_string)
def on_need_data(self, src, length):
# frame_list is a Manager.list() containing cv2 frame
data = cv2.resize(frame_list[self.image_type], (640, 360), interpolation = cv2.INTER_LINEAR)
data = data.tobytes()
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
src.emit('push-buffer', buf)
# attaching the source element to the rtsp media
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 MulticastServer(GstRtspServer.RTSPServer):
def __init__(self):
GstRtspServer.RTSPServer.__init__(self)
self.set_service("5000")
self.factory0 = SensorFactory(0)
self.factory0.set_shared(True)
self.factory0.set_eos_shutdown(True)
# Multicast address setup
self.address_pool = GstRtspServer.RTSPAddressPool.new()
self.address_pool.add_range("224.0.0.1", "240.0.0.10", 5000, 5010, 5)
self.factory0.set_address_pool(self.address_pool)
self.get_mount_points().add_factory("/stream", self.factory0)
Gst.init(None)
server = MulticastServer()
server.attach(None)
GLib.MainLoop().run()
字符串
1条答案
按热度按时间lhcgjxsq1#
这可能不是最佳的解决方案,但这个简单的方案可能适用于您的情况:
1.使用openCV VideoWriter和gstreamer后台编码成H264,并使用UDP/5000将RTPH264流到localhost:
字符串
2.使用同一台主机上的另一个线程或进程运行RTSP服务器,从UDP/5000阅读RTPH 264,然后只进行支付和偿还:
型
3.测试:
从localhost:
型
另一个主持人:
型