diff --git a/main.py b/main.py index 3dc20d4..70fa69f 100644 --- a/main.py +++ b/main.py @@ -1842,42 +1842,124 @@ def start_record(url_data: tuple, count_variable: int = -1) -> None: # "-f", "flv", srs_rtmp # ] - # ffplay 预览命令(极致低延迟 + 全屏 HDMI,已非常完美,再加两项) + # # 1080p ffplay 预览命令(极致低延迟 + 全屏 HDMI,已非常完美,再加两项) + # ffplay_cmd = [ + # "ffplay", + # "-f", "flv", + # "-fflags", "nobuffer+flush_packets", + # "-flags", "low_delay", + # "-framedrop", # 关键:网络抖动时掉帧保流畅 + # "-infbuf", # 防止输入端卡住 + # "-probesize", "32", + # "-analyzeduration", "0", + # "-sync", "ext", + # "-vf", "transpose=2," + # "colorspace=all=bt709:iall=bt709:fast=1," # 加 fast=1 轻微加速颜色转换 + # "eq=gamma_r=0.95:gamma_g=1.0:gamma_b=1.05:" + # "brightness=0.03:saturation=0.85:contrast=1.05", + # "-fs", + # "-autoexit", + # "-threads", "8", # A733 8核,用满没问题 + # "-nodisp", "no", # 确保显示(某些环境需要显式) + # "-" + # ] + + # # 1080p 主 ffmpeg 命令(1080p 最优平衡版,小改动) + # ffmpeg_command = [ + # "ffmpeg", + # "-y", + # "-loglevel", "info", + # "-nostdin", + # "-re", + # "-stats", "-stats_period", "2", # 改成 2 秒一次,减少日志刷屏,略省 CPU + # # 重连参数 + # "-rw_timeout", "30000000", + # "-reconnect", "1", + # "-reconnect_at_eof", "1", + # "-reconnect_streamed", "1", + # "-reconnect_delay_max", "15", # 稍长一点,更稳 + # # 极致低延迟输入 + # "-fflags", "+genpts+discardcorrupt+nobuffer+flush_packets", + # "-flags", "low_delay", + # "-err_detect", "ignore_err", + # "-headers", douyin_headers, + # "-i", real_url, + + # # 视频处理:1080p 竖屏(lanczos 画质好,A733 完全吃得住) + # "-vf", "fps=30," + # "scale=1080:1920:force_original_aspect_ratio=decrease:flags=lanczos," + # "pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black", + + # # 编码:veryfast + zerolatency 是当前最佳平衡 + # "-c:v", "libx264", + # "-preset", "veryfast", # A733 上 veryfast 比 ultrafast 画质明显更好,CPU 占用仅高 5-10% + # "-tune", "zerolatency", + # "-profile:v", "high", + # "-b:v", "5200k", + # "-maxrate", "5800k", + # "-bufsize", "10400k", + # "-g", "60", + # "-keyint_min", "30", + # "-r", "30", + # "-vsync", "cfr", + # "-bf", "0", + # "-sc_threshold", "0", + # "-x264-params", "force-cfr=1:scenecut=0:open_gop=0:sync-lookahead=0", + # "-pix_fmt", "yuv420p", + + # # 音频(保持不变,完美) + # "-c:a", "aac", + # "-b:a", "128k", + # "-ar", "44100", + # "-ac", "2", + # "-af", "aresample=async=1:first_pts=0", + + # # 输出 + # "-flags", "+global_header", + # "-flvflags", "no_duration_filesize", + # "-f", "flv", + # "pipe:1" + # ] + + + + # ==================== 最佳稳定方案:720p + 极致防护 ffplay ==================== + ffplay_cmd = [ "ffplay", "-f", "flv", - "-fflags", "nobuffer+flush_packets", + "-fflags", "nobuffer+flush_packets", # 零缓冲,低延迟 "-flags", "low_delay", - "-framedrop", # 关键:网络抖动时掉帧保流畅 - "-infbuf", # 防止输入端卡住 + "-framedrop", # 网络抖动时掉帧保流畅 + "-infbuf", # 防止输入端卡住 "-probesize", "32", "-analyzeduration", "0", - "-sync", "ext", + "-sync", "ext", # 外部同步,减少等待 "-vf", "transpose=2," - "colorspace=all=bt709:iall=bt709:fast=1," # 加 fast=1 轻微加速颜色转换 + "colorspace=all=bt709:iall=bt709:fast=1," # 颜色空间转换加速 "eq=gamma_r=0.95:gamma_g=1.0:gamma_b=1.05:" - "brightness=0.03:saturation=0.85:contrast=1.05", - "-fs", - "-autoexit", - "-threads", "8", # A733 8核,用满没问题 - "-nodisp", "no", # 确保显示(某些环境需要显式) - "-" + "brightness=0.03:saturation=0.85:contrast=1.05", # 你喜欢的调色 + "-fs", # 全屏 HDMI + # "-autoexit", # 坚决去掉!防止 ffplay 误判流结束而退出 + "--loop", "0", # 关键防护:无限循环,即使短暂无数据也不退出 + "-threads", "8", # A733 8核,用满调度更好 + "-nodisp", "no", # 确保强制显示 + "-" ] - # 主 ffmpeg 命令(1080p 最优平衡版,小改动) ffmpeg_command = [ "ffmpeg", "-y", "-loglevel", "info", "-nostdin", "-re", - "-stats", "-stats_period", "2", # 改成 2 秒一次,减少日志刷屏,略省 CPU + "-stats", "-stats_period", "2", # 每2秒打印一次状态,减少日志开销 # 重连参数 "-rw_timeout", "30000000", "-reconnect", "1", "-reconnect_at_eof", "1", "-reconnect_streamed", "1", - "-reconnect_delay_max", "15", # 稍长一点,更稳 + "-reconnect_delay_max", "15", # 极致低延迟输入 "-fflags", "+genpts+discardcorrupt+nobuffer+flush_packets", "-flags", "low_delay", @@ -1885,19 +1967,19 @@ def start_record(url_data: tuple, count_variable: int = -1) -> None: "-headers", douyin_headers, "-i", real_url, - # 视频处理:1080p 竖屏(lanczos 画质好,A733 完全吃得住) + # ==================== 视频处理:720p 竖屏(最稳定) ==================== "-vf", "fps=30," - "scale=1080:1920:force_original_aspect_ratio=decrease:flags=lanczos," - "pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black", + "scale=720:1280:force_original_aspect_ratio=decrease:flags=lanczos," + "pad=720:1280:(ow-iw)/2:(oh-ih)/2:black", - # 编码:veryfast + zerolatency 是当前最佳平衡 + # ==================== 编码参数:最高稳定性 + 低负载 ==================== "-c:v", "libx264", - "-preset", "veryfast", # A733 上 veryfast 比 ultrafast 画质明显更好,CPU 占用仅高 5-10% - "-tune", "zerolatency", + "-preset", "ultrafast", # 最高速度,最低 CPU,防止启动阶段冲垮 ffplay + "-tune", "zerolatency", # 最低延迟 "-profile:v", "high", - "-b:v", "5200k", - "-maxrate", "5800k", - "-bufsize", "10400k", + "-b:v", "2600k", # 720p 清晰推荐比特率 + "-maxrate", "3000k", + "-bufsize", "6000k", "-g", "60", "-keyint_min", "30", "-r", "30", @@ -1907,102 +1989,20 @@ def start_record(url_data: tuple, count_variable: int = -1) -> None: "-x264-params", "force-cfr=1:scenecut=0:open_gop=0:sync-lookahead=0", "-pix_fmt", "yuv420p", - # 音频(保持不变,完美) + # ==================== 音频 ==================== "-c:a", "aac", "-b:a", "128k", "-ar", "44100", "-ac", "2", "-af", "aresample=async=1:first_pts=0", - # 输出 + # ==================== 输出 ==================== "-flags", "+global_header", "-flvflags", "no_duration_filesize", "-f", "flv", "pipe:1" ] - ## 720p ffplay 预览命令(全屏显示到 HDMI) - # ffplay_cmd = [ - # "ffplay", - # "-f", "flv", # 输入格式必须匹配 ffmpeg 的 -f flv - # "-fflags", "nobuffer", - # "-flags", "low_delay", - # "-framedrop", - # "-vf", "transpose=2,colorspace=all=bt709:iall=bt709," - # "eq=gamma_r=0.95:gamma_g=1.0:gamma_b=1.05:" - # "brightness=0.03:saturation=0.85:contrast=1.05", # 您喜欢的调色滤镜 - # "-fs", # 全屏 - # "-autoexit", # 流结束自动退出 - # "-threads", "6", - # "-" # 从标准输入(管道)读取 - # ] - - - # # 720p 输出到 HDMI(优化版,适合 Orange Pi Zero 2W) - # ffmpeg_command = [ - # "ffmpeg", - # "-y", - # "-loglevel", "info", - # "-nostdin", - # "-re", - - # "-stats", "-stats_period", "1", - - # # 抖音源重连参数 - # "-rw_timeout", "30000000", - # "-reconnect", "1", - # "-reconnect_at_eof", "1", - # "-reconnect_streamed", "1", - # "-reconnect_delay_max", "10", - - # # 低延迟输入 flags - # "-fflags", "+genpts+discardcorrupt+nobuffer+flush_packets", - # "-flags", "low_delay", - # "-err_detect", "ignore_err", - - # # 输入 headers(抖音必备) - # "-headers", douyin_headers, - # "-i", real_url, - - # # ==================== 视频处理:720p 竖屏 ==================== - # "-vf", "fps=30," - # "scale=720:1280:force_original_aspect_ratio=decrease:flags=lanczos," - # "pad=720:1280:(ow-iw)/2:(oh-ih)/2:black", - - # # ==================== 编码参数(轻量优化) ==================== - # "-c:v", codec_v, # libx264(板子无硬件加速) - # "-preset", "ultrafast", # 关键:极大降低 CPU 负载(比 veryfast 更快) - # "-tune", "zerolatency", # 低延迟 - # "-profile:v", "high", - - # "-b:v", "2600k", # 720p 推荐比特率,清晰又省资源 - # "-maxrate", "3000k", - # "-bufsize", "6000k", - - # "-g", "60", # GOP = 2 秒(30fps 时每 60 帧一个 I 帧) - # "-keyint_min", "30", - # "-r", "30", - # "-vsync", "cfr", - # "-bf", "0", - # "-sc_threshold", "0", - # "-x264-params", "force-cfr=1:scenecut=0:open_gop=0:sync-lookahead=0", - # "-pix_fmt", "yuv420p", - - # # ==================== 音频(保持不变) ==================== - # "-c:a", "aac", - # "-b:a", "128k", - # "-ar", "44100", - # "-ac", "2", - # "-af", "aresample=async=1:first_pts=0", - - # # ==================== 输出格式 ==================== - # "-flags", "+global_header", - # "-flvflags", "no_duration_filesize", - - # "-f", "flv", - # "pipe:1" - # ] - # ---- 单层重试循环(清晰可控) ---- proc = None ffplay_proc = None # <--- 新增这一行