From c53227d991ccb960b4547b85736015f7080ee9f7 Mon Sep 17 00:00:00 2001 From: giles Date: Wed, 25 Feb 2026 15:30:35 +0000 Subject: [PATCH] Fix multi-res HLS encoding on CPU: fall back to libx264 when NVENC unavailable The hardcoded h264_nvenc encoder fails on CPU-only workers. Now uses check_nvenc_available() to auto-detect and falls back to libx264. Co-Authored-By: Claude Opus 4.6 --- l1/streaming/multi_res_output.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/l1/streaming/multi_res_output.py b/l1/streaming/multi_res_output.py index 40c661a..33e4413 100644 --- a/l1/streaming/multi_res_output.py +++ b/l1/streaming/multi_res_output.py @@ -21,6 +21,8 @@ from dataclasses import dataclass, field import numpy as np +from streaming.output import check_nvenc_available + # Try GPU imports try: import cupy as cp @@ -222,14 +224,26 @@ class MultiResolutionHLSOutput: "-vf", f"scale={quality.width}:{quality.height}:flags=lanczos", ]) - # NVENC encoding with quality settings + # Encoding settings - use NVENC if available, fall back to libx264 + use_nvenc = check_nvenc_available() + if use_nvenc: + cmd.extend([ + "-c:v", "h264_nvenc", + "-preset", "p4", # Balanced speed/quality + "-tune", "hq", + "-b:v", f"{quality.bitrate}k", + "-maxrate", f"{int(quality.bitrate * 1.5)}k", + "-bufsize", f"{quality.bitrate * 2}k", + ]) + else: + cmd.extend([ + "-c:v", "libx264", + "-preset", "fast", + "-b:v", f"{quality.bitrate}k", + "-maxrate", f"{int(quality.bitrate * 1.5)}k", + "-bufsize", f"{quality.bitrate * 2}k", + ]) cmd.extend([ - "-c:v", "h264_nvenc", - "-preset", "p4", # Balanced speed/quality - "-tune", "hq", - "-b:v", f"{quality.bitrate}k", - "-maxrate", f"{int(quality.bitrate * 1.5)}k", - "-bufsize", f"{quality.bitrate * 2}k", "-g", str(int(self.fps * self.segment_duration)), # Keyframe interval = segment duration "-keyint_min", str(int(self.fps * self.segment_duration)), "-sc_threshold", "0", # Disable scene change detection for consistent segments