有没有办法使用RTSP以相同的地址和路线连续流式传输多个视频?

问题描述 投票:0回答:1

我正在参与一个使用 RTSP 和摄像机镜头的项目。我的目标是创建在同一地址路线中播放的连续视频流,以根据我们需要显示的镜头更新视频。

因此,我必须创建的预期行为是更改地址中传输的视频,同时使用 ffplay 可视化我正在创建的流。这是通过此图重新创建的:

但这根本行不通。每当我尝试更改视频时,原始视频就会冻结并且无法可视化任何内容。 ffplay 抛出错误:

rtsp://localhost:8554/sample: error while seeking
。这对我来说很奇怪,因为当我关闭传输并再次打开它时,它显示了我现在想要可视化的更改后的镜头。

要创建 RTSP 服务器,我使用此存储库:https://github.com/p513817/rtsp4k。它基于 mediamtx 和 Python 来重新创建所有逻辑。

我对 RTSP 没有任何了解,所以我不知道是否应该做一些低级的事情来保持流量而不完成视频,或者我应该尝试其他框架。我需要帮助!

我更新视频的逻辑是

    def put_placeholder(self, input:str, route: str):
        success = True
        try:
            # I change the Displayer to show my placeholder instead the original video
            self.dprs[route] = Displayer(
                input='./utils/placeholder.mp4',
                route=str(route),
                start_stream=True
            )

            # Same here
            if route in PARAMS.CONF["streams"] :
                PARAMS.CONF["streams"][route] = {
                    "input": './utils/placeholder.mp4'
                }
                write_config(PARAMS.CONF_PATH, PARAMS.CONF)

        except Exception as e:
            logging.exception(e)
            success = False

        finally:
            # I update the info in the .json that summarize all the streams
            self._update_info(
                input='./utils/placeholder.mp4', 
                route=route, 
                url=self.dprs[route].get_url() if success else "", 
                status=success )

        return self.info[route]
python video-streaming rtsp ffplay
1个回答
0
投票

我意识到我正在创建一个新对象,而不是更改当前对象。这使得 ffplay 无法跟踪地址和路由,因为失去连接,然后立即重新连接,导致流崩溃。

更新视频的最终代码是:

    def put_placeholder(self, input:str, route: str):
        success = True
        try:
            # NOTE: modify config
            path = ""
            if input == 'placeholder':
                path = './utils/placeholder.mp4'
            else:
                path = './data/'+input+'.mp4'
            
            self.dprs[route].change_input(path)

            if route in PARAMS.CONF["streams"] :
                    PARAMS.CONF["streams"][route] = {
                        "input": path
                    }
                    write_config(PARAMS.CONF_PATH, PARAMS.CONF)

        except Exception as e:
            logging.exception(e)
            success = False

        finally:
            self._update_info(
                input=path, 
                route=route, 
                url=self.dprs[route].get_url() if success else "", 
                status=success )

        return self.info[route]
© www.soinside.com 2019 - 2024. All rights reserved.