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 <noreply@anthropic.com>
This commit is contained in:
@@ -21,6 +21,8 @@ from dataclasses import dataclass, field
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
|
from streaming.output import check_nvenc_available
|
||||||
|
|
||||||
# Try GPU imports
|
# Try GPU imports
|
||||||
try:
|
try:
|
||||||
import cupy as cp
|
import cupy as cp
|
||||||
@@ -222,14 +224,26 @@ class MultiResolutionHLSOutput:
|
|||||||
"-vf", f"scale={quality.width}:{quality.height}:flags=lanczos",
|
"-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([
|
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
|
"-g", str(int(self.fps * self.segment_duration)), # Keyframe interval = segment duration
|
||||||
"-keyint_min", str(int(self.fps * self.segment_duration)),
|
"-keyint_min", str(int(self.fps * self.segment_duration)),
|
||||||
"-sc_threshold", "0", # Disable scene change detection for consistent segments
|
"-sc_threshold", "0", # Disable scene change detection for consistent segments
|
||||||
|
|||||||
Reference in New Issue
Block a user