新增切换流逻辑

This commit is contained in:
zqc
2026-03-03 15:02:10 +08:00
parent 44c97a14af
commit e5a313322b

View File

@@ -20,6 +20,12 @@ ffmpeg_process: Optional[subprocess.Popen] = None
running = True running = True
should_restart = False # 标记是否需要重新启动ffmpeg凌晨3点触发 should_restart = False # 标记是否需要重新启动ffmpeg凌晨3点触发
# ffmpeg 退出追踪状态(用于判断是否切换 stream_type
state = {
'exit_times': [], # 记录 ffmpeg 退出时间戳
'use_fallback_stream': False # 标记下次是否使用 stream_type=1
}
def parse_args(): def parse_args():
"""解析命令行参数""" """解析命令行参数"""
@@ -55,9 +61,20 @@ def parse_args():
def get_hls_url(index_code: str) -> Optional[str]: def get_hls_url(index_code: str) -> Optional[str]:
"""获取HLS播放地址""" """获取HLS播放地址"""
# 确定使用哪个 stream_type
stream_type = 0
try:
stream_type = 1 if state['use_fallback_stream'] else 0
if state['use_fallback_stream']:
state['use_fallback_stream'] = False
state['exit_times'].clear() # 使用 fallback 时清空退出记录
logger.info("Using fallback stream_type=1")
except Exception as e:
logger.error(f"Error determining stream_type: {e}")
try: try:
import test_cam import test_cam
result = test_cam.get_camera_hls_url(index_code, 0) result = test_cam.get_camera_hls_url(index_code, stream_type)
if result.get("code") == "0" and result.get("data", {}).get("url"): if result.get("code") == "0" and result.get("data", {}).get("url"):
return result["data"]["url"] return result["data"]["url"]
else: else:
@@ -238,6 +255,18 @@ def main():
if ffmpeg_process is None or ffmpeg_process.poll() is not None: if ffmpeg_process is None or ffmpeg_process.poll() is not None:
if ffmpeg_process is not None and ffmpeg_process.poll() is not None: if ffmpeg_process is not None and ffmpeg_process.poll() is not None:
logger.warning(f"FFmpeg exited unexpectedly with code: {ffmpeg_process.returncode}") logger.warning(f"FFmpeg exited unexpectedly with code: {ffmpeg_process.returncode}")
# 记录退出时间,检查是否需要切换 stream_type
try:
state['exit_times'].append(datetime.now())
# 清理超过10分钟的旧记录
state['exit_times'][:] = [t for t in state['exit_times'] if datetime.now() - t < timedelta(minutes=10)]
if len(state['exit_times']) > 3: # 10分钟内退出超过3次即第4次
state['use_fallback_stream'] = True
logger.warning("FFmpeg exited 4+ times in 10 minutes, will use stream_type=1 next call")
except Exception as e:
logger.error(f"Error tracking exit times: {e}")
# 尝试启动下载 # 尝试启动下载
success = download_cycle( success = download_cycle(