diff --git a/src/chongming_stream_manager/__init__.py b/src/chongming_stream_manager/__init__.py index d34747f..3f56378 100644 --- a/src/chongming_stream_manager/__init__.py +++ b/src/chongming_stream_manager/__init__.py @@ -15,6 +15,23 @@ class StreamManager: self._semaphore = asyncio.Semaphore(max_streams) self._mediamtx_addr = mediamtx_addr self._video_path = video_path + self._support_reconnect = self._check_reconnect_support() + logger.info(f"FFmpeg reconnect support: {self._support_reconnect}") + + @staticmethod + def _check_reconnect_support() -> bool: + try: + result = subprocess.run( + ["ffmpeg", "-h", "full"], + capture_output=True, + text=True, + timeout=5 + ) + if result.returncode != 0: + return False + return bool(re.search(r'^-reconnect\b', result.stdout, re.MULTILINE)) + except (subprocess.TimeoutExpired, FileNotFoundError): + return False def _is_local_file(self, url: str) -> bool: """判断是否为本地文件(绝对路径或相对路径)""" @@ -35,14 +52,11 @@ class StreamManager: ]) else: # ----- RTSP 网络流模式(支持自动重连) ----- - cmd.extend([ - "-rtsp_transport", "tcp", - "-stimeout", "3000000", # 3 秒超时 - "-reconnect", "1", - "-reconnect_streamed", "1", - "-reconnect_delay_max", "5", - "-i", source_url - ]) + base_args = ["-rtsp_transport", "tcp", "-stimeout", "3000000"] + if self._support_reconnect: + base_args.extend(["-reconnect", "1", "-reconnect_streamed", "1", "-reconnect_delay_max", "5"]) + cmd.extend(base_args) + cmd.extend(["-i", source_url]) # 公共输出部分(流复制,推送到 MediaMTX) cmd.extend([