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

所以,我要创建的预期行为是更改地址中的视频流,同时使用ffplay来可视化我正在创建的流.这是由下图重新创建的:

enter image description here

但这根本行不通.每当我试图更改视频时,原始视频就会冻结,无法将任何东西可视化.FFPLAY抛出错误:rtsp://localhost:8554/sample: error while seeking.这对我来说很奇怪,因为当我关闭变速器并再次打开它时,它显示了我现在想要可视化的更改后的镜头.

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

我没有RTSP的知识,所以我不知道我是否应该做一些低水平的事情来保持流量,而不是完成视频,或者我应该try 其他框架.我需要帮助!

我更新视频的逻辑是

    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]

推荐答案

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

更新视频的最后一段代码是对我在rtsp_handler.py中的Manager类中创建的函数put_placeholder的修改.它通过创建一个更新文件路径的函数在Display类中添加了一个名为change_input()的新函数,并且not创建了一个新的线程或类实例.

    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]
    def change_input(self, new_input:str):
        self.input = new_input
        self.src = self._create_source()

Python相关问答推荐

学习率未更新

Pandas 密集排名具有相同值,按顺序排列

查找3D数组中沿一个轴的相同值序列的长度(与行程长度编码相关)

X射线扫描显示Docker中的pip漏洞,尽管图像中未安装pip

将大小为n*512的数组绘制到另一个大小为n*256的数组的PC组件

两极:如何分割一个大 pyramid 并并行保存每个

如何使用Google Gemini API为单个提示生成多个响应?

如何调整spaCy token 化器,以便在德国模型中将数字拆分为行末端的点

如何比较numPy数组中的两个图像以获取它们不同的像素

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

为什么默认情况下所有Python类都是可调用的?

两个pandas的平均值按元素的结果串接元素.为什么?

从groupby执行计算后创建新的子框架

DataFrames与NaN的条件乘法

在vscode上使用Python虚拟环境时((env))

如何在Polars中从列表中的所有 struct 中 Select 字段?

提取相关行的最快方法—pandas

如何从需要点击/切换的网页中提取表格?

如何找出Pandas 图中的连续空值(NaN)?