diff --git a/.gitignore b/.gitignore index f9fdcf8..7962bd9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ cache/ __pycache__/ +records/ diff --git a/backup/back7 b/backup/back7 index 07228b4..65ae3df 100644 --- a/backup/back7 +++ b/backup/back7 @@ -7,6 +7,7 @@ import time import signal import sys import logging +import platform import spider import stream @@ -17,6 +18,8 @@ logging.basicConfig( datefmt="%H:%M:%S" ) +IS_WINDOWS = platform.system() == "Windows" + # ----------------- Douyin to YouTube Streamer ----------------- class DouyinToYouTubeStreamer: def __init__(self, bitrate=5000, audio_bitrate=128, resolution='720x1280', @@ -87,7 +90,7 @@ class DouyinToYouTubeStreamer: '-b:a', f'{self.audio_bitrate}k', '-ar', '44100', '-ac', '2', - '-movflags', '+faststart+frag_keyframe', # <--- 关键修改 + '-movflags', '+faststart+frag_keyframe', self.out_file ] return cmd @@ -181,10 +184,14 @@ class DouyinToYouTubeStreamer: def _finalize_recording(self): if self.out_file and os.path.exists(self.out_file): try: - # 如果进程未退出,先发送中断信号完成封装 + # 根据系统发送信号完成封装 if self.record_proc and self.record_proc.poll() is None: - self.record_proc.send_signal(signal.CTRL_BREAK_EVENT if os.name == 'nt' else signal.SIGINT) - self.record_proc.wait(timeout=5) + sig = signal.CTRL_BREAK_EVENT if IS_WINDOWS else signal.SIGINT + self.record_proc.send_signal(sig) + try: + self.record_proc.wait(timeout=5) + except subprocess.TimeoutExpired: + self.record_proc.kill() except Exception: pass @@ -197,7 +204,6 @@ class DouyinToYouTubeStreamer: except FileExistsError: new_name = self.out_file.replace(".mp4", f"_{uuid.uuid4().hex[:4]}.mp4") os.rename(self.out_file, new_name) - size_mb = os.path.getsize(new_name) / (1024 * 1024) logging.info(f"[{self.room_name}] 本地录制已结束: {new_name} | 大小: {size_mb:.2f} MB") @@ -246,5 +252,6 @@ if __name__ == "__main__": signal.signal(signal.SIGTERM, signal_handler) logging.info("程序已启动,低延迟推流中,按 Ctrl+C 停止...") + while True: time.sleep(60) diff --git a/live.py b/live.py index 07228b4..6e91a37 100644 --- a/live.py +++ b/live.py @@ -7,6 +7,7 @@ import time import signal import sys import logging +import platform import spider import stream @@ -17,6 +18,8 @@ logging.basicConfig( datefmt="%H:%M:%S" ) +IS_WINDOWS = platform.system() == "Windows" + # ----------------- Douyin to YouTube Streamer ----------------- class DouyinToYouTubeStreamer: def __init__(self, bitrate=5000, audio_bitrate=128, resolution='720x1280', @@ -87,7 +90,7 @@ class DouyinToYouTubeStreamer: '-b:a', f'{self.audio_bitrate}k', '-ar', '44100', '-ac', '2', - '-movflags', '+faststart+frag_keyframe', # <--- 关键修改 + '-movflags', '+faststart+frag_keyframe', self.out_file ] return cmd @@ -181,10 +184,14 @@ class DouyinToYouTubeStreamer: def _finalize_recording(self): if self.out_file and os.path.exists(self.out_file): try: - # 如果进程未退出,先发送中断信号完成封装 + # 根据系统发送信号完成封装 if self.record_proc and self.record_proc.poll() is None: - self.record_proc.send_signal(signal.CTRL_BREAK_EVENT if os.name == 'nt' else signal.SIGINT) - self.record_proc.wait(timeout=5) + sig = signal.CTRL_BREAK_EVENT if IS_WINDOWS else signal.SIGINT + self.record_proc.send_signal(sig) + try: + self.record_proc.wait(timeout=5) + except subprocess.TimeoutExpired: + self.record_proc.kill() except Exception: pass @@ -197,7 +204,6 @@ class DouyinToYouTubeStreamer: except FileExistsError: new_name = self.out_file.replace(".mp4", f"_{uuid.uuid4().hex[:4]}.mp4") os.rename(self.out_file, new_name) - size_mb = os.path.getsize(new_name) / (1024 * 1024) logging.info(f"[{self.room_name}] 本地录制已结束: {new_name} | 大小: {size_mb:.2f} MB")