modify: ffmpeg -reconnect 参数兼容问题
This commit is contained in:
@@ -15,6 +15,23 @@ class StreamManager:
|
|||||||
self._semaphore = asyncio.Semaphore(max_streams)
|
self._semaphore = asyncio.Semaphore(max_streams)
|
||||||
self._mediamtx_addr = mediamtx_addr
|
self._mediamtx_addr = mediamtx_addr
|
||||||
self._video_path = video_path
|
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:
|
def _is_local_file(self, url: str) -> bool:
|
||||||
"""判断是否为本地文件(绝对路径或相对路径)"""
|
"""判断是否为本地文件(绝对路径或相对路径)"""
|
||||||
@@ -35,14 +52,11 @@ class StreamManager:
|
|||||||
])
|
])
|
||||||
else:
|
else:
|
||||||
# ----- RTSP 网络流模式(支持自动重连) -----
|
# ----- RTSP 网络流模式(支持自动重连) -----
|
||||||
cmd.extend([
|
base_args = ["-rtsp_transport", "tcp", "-stimeout", "3000000"]
|
||||||
"-rtsp_transport", "tcp",
|
if self._support_reconnect:
|
||||||
"-stimeout", "3000000", # 3 秒超时
|
base_args.extend(["-reconnect", "1", "-reconnect_streamed", "1", "-reconnect_delay_max", "5"])
|
||||||
"-reconnect", "1",
|
cmd.extend(base_args)
|
||||||
"-reconnect_streamed", "1",
|
cmd.extend(["-i", source_url])
|
||||||
"-reconnect_delay_max", "5",
|
|
||||||
"-i", source_url
|
|
||||||
])
|
|
||||||
|
|
||||||
# 公共输出部分(流复制,推送到 MediaMTX)
|
# 公共输出部分(流复制,推送到 MediaMTX)
|
||||||
cmd.extend([
|
cmd.extend([
|
||||||
|
|||||||
Reference in New Issue
Block a user