GStreamer RTSP服务器端口配置与多流多设备访问问题
GStreamer RTSP Server 问题解决方案
问题1:从config.json读取并设置RTSP端口
当前代码仅创建单个RTSP服务器实例,默认绑定8554端口,未利用配置文件中的rtsp_port参数。解决核心是为每个独立端口创建专属的RTSP服务器实例——GStreamer的RTSPServer每个实例只能绑定一个端口。
修改实现
重构服务器类,使其对应单个端口/流配置,通过set_service()方法绑定指定端口:
问题2:单服务器多端口多流 & 多设备访问
- 单RTSP服务器无法绑定多个端口,多端口需对应多服务器实例;更高效的多流方案是在同一端口下使用不同挂载点(如
/stream1、/stream2),无需多端口。 - 多设备访问问题:已设置
factory.set_shared(True),需进一步优化编码参数确保兼容性,比如x264enc的关键帧间隔配置。
修改后的完整代码
import json import argparse import gi gi.require_version('Gst', '1.0') gi.require_version('GstRtspServer', '1.0') gi.require_version('GLib', '2.0') from gi.repository import Gst, GstRtspServer, GLib Gst.init(None) class TestRtspMediaFactory(GstRtspServer.RTSPMediaFactory): def __init__(self, source): GstRtspServer.RTSPMediaFactory.__init__(self) self.source = source def do_create_element(self, url): image_folder = self.source.get("image_folder", None) if image_folder: # 优化编码参数,提升多客户端兼容性 pipeline = ( f"multifilesrc location={image_folder}/%d.jpg index=1 caps=\"image/jpeg,framerate=30/1\" ! " "jpegdec ! videoconvert ! " "x264enc tune=zerolatency bitrate=500 speed-preset=superfast key-int-max=60 ! " "rtph264pay name=pay0 config-interval=1 pt=96" ) else: print("Invalid source. Specify 'image_folder' in the configuration.") return None print("Element created:", pipeline) return Gst.parse_launch(pipeline) class GstreamerRtspServer(): def __init__(self, source): self.rtsp_server = GstRtspServer.RTSPServer() # 绑定配置文件中的端口 self.rtsp_server.set_service(str(source["rtsp_port"])) self.mount_points = self.rtsp_server.get_mount_points() self.create_rtsp_stream(source) self.rtsp_server.attach(None) def create_rtsp_stream(self, source): rtsp_mount_point = source["rtsp_mount_point"] print(f"启动流: rtsp://localhost:{source['rtsp_port']}{rtsp_mount_point}") factory = TestRtspMediaFactory(source) # 开启共享模式,允许多客户端同时访问 factory.set_shared(True) self.mount_points.add_factory(rtsp_mount_point, factory) def main(config_file): with open(config_file, 'r') as f: config = json.load(f) sources = config.get("sources", []) servers = [] # 为每个配置项创建独立的RTSP服务器实例 for source in sources: server = GstreamerRtspServer(source) servers.append(server) loop = GLib.MainLoop() loop.run() if __name__ == '__main__': parser = argparse.ArgumentParser(description="Run RTSP server for multiple video sources.") parser.add_argument("--config", required=True, help="Path to the JSON configuration file.") args = parser.parse_args() main(args.config)
关键修改点说明
- 端口绑定:每个
GstreamerRtspServer实例对应一个端口,通过set_service()设置配置文件中的端口号 - 多流优化:若无需多端口,可将多个source的
rtsp_port设为同一值,仅修改rtsp_mount_point,实现同一端口下多流分发 - 编码兼容性:增加
key-int-max=60控制关键帧间隔,配合tune=zerolatency和config-interval=1,确保多客户端快速拉流
同一端口多流示例配置
{ "sources": [ { "image_folder": "/path/to/image/folder1", "rtsp_port": 8554, "rtsp_mount_point": "/stream1" }, { "image_folder": "/path/to/image/folder2", "rtsp_port": 8554, "rtsp_mount_point": "/stream2" } ] }
客户端可通过rtsp://[本机IP]:8554/stream1和rtsp://[本机IP]:8554/stream2访问不同流,且同一流支持多设备同时播放。
内容的提问来源于stack exchange,提问作者NevMthw
相关产品推荐
相关产品推荐

