    def run(self):
        """
        主逻辑：循环进行分段录制。
        - 每段录制：
          1) 启动 streamlink；若 EOF 则退出。
          2) 启动 ffmpeg (带 -fs 参数限制输出大小)；
          3) 从 streamlink stdout 读数据，写给 ffmpeg stdin；
          4) ffmpeg 到时长后退出，然后杀掉 streamlink；
          5) 进入下一段，如此往复。
        - 若中途发现 streamlink 无数据（EOF）则跳出循环。
        """

        file_index = 1
        retry_count = 0
        while True:
            if self.stop_event.is_set():
                break
            if retry_count >= 5:
                logger.info("这个直播流已经失效，停止下载器")
                return

            output_filename = f"{self.output_prefix}{file_index:03d}.mkv"
            # print(f"\n[run] ========== 准备录制第 {file_index} 段：{output_filename} ==========")
            # logging.info(f"\n[run] == 当前下载流地址：{self.stream_url} ==")
            logging.info(f"\n[run] == 准备录制第 {file_index} 段：{output_filename} ==")
            output_filename = "-"
            is_hls = '.m3u8' in urlparse(self.stream_url).path
            if not is_hls:
                # print("[run] 输入源不是 HLS 地址，将直接使用 ffmpeg 进行录制。", self.stream_url)
                logging.info("[run] 输入源不是 HLS 地址，将直接使用 ffmpeg 进行录制。")
                ffmpeg_cmd = self.build_ffmpeg_cmd(self.stream_url, output_filename,
                                                   self.headers, self.segment_duration)
                if not self.run_ffmpeg_with_url(ffmpeg_cmd, output_filename):
                    retry_count += 1
                    time.sleep(1)
                    continue
            else:
                # print("[run] 输入源是 HLS 地址，将使用 streamlink + ffmpeg 进行录制。")
                logging.info("[run] 输入源是 HLS 地址，将使用 streamlink + ffmpeg 进行录制。")
                streamlink_cmd = [
                    "streamlink",
                    "--stream-segment-threads", "3",
                    "--hls-playlist-reload-attempts", "1",
                    "--http-header", ';'.join([f'{key}={value}' for key, value in self.headers.items()]),
                    self.stream_url,
                    self.quality,
                    "-O"  # 输出到 stdout
                ]
                # output_filename = "-"
                ffmpeg_cmd = self.build_ffmpeg_cmd("pipe:0", output_filename, None, self.segment_duration)
                if not self.run_streamlink_with_ffmpeg(streamlink_cmd, ffmpeg_cmd, output_filename):
                    retry_count += 1
                    time.sleep(1)
                    continue

            # 6. 进入下一段
            # if file_index != 1:
            self.video_queue.put(None)  # 通知消费者线程本段录制结束
            file_index += 1
主逻辑：循环进行分段录制。
- 每段录制：
1) 启动 streamlink；若 EOF 则退出。
2) 启动 ffmpeg (带 -fs 参数限制输出大小)；
3) 从 streamlink stdout 读数据，写给 ffmpeg stdin；
4) ffmpeg 到时长后退出，然后杀掉 streamlink；
5) 进入下一段，如此往复。
- 若中途发现 streamlink 无数据（EOF）则跳出循环。
biliup/engine/sync_downloader.py