You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改点说明

  1. 端口绑定:每个GstreamerRtspServer实例对应一个端口,通过set_service()设置配置文件中的端口号
  2. 多流优化:若无需多端口,可将多个source的rtsp_port设为同一值,仅修改rtsp_mount_point,实现同一端口下多流分发
  3. 编码兼容性:增加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:30:00