我正在参与一个使用 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]
我意识到我正在创建一个新对象,而不是更改当前对象。这使得 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]