Update transcode_bench.py
This commit is contained in:
@@ -486,6 +486,7 @@ class Benchmark:
|
|||||||
self.hwaccel_args = hwaccel_args
|
self.hwaccel_args = hwaccel_args
|
||||||
self.accel_name = accel_name
|
self.accel_name = accel_name
|
||||||
self.hw_decode = hw_decode
|
self.hw_decode = hw_decode
|
||||||
|
self.hit_nvenc_limit = False # Track if we hit NVIDIA session limit
|
||||||
|
|
||||||
# Determine HEVC encoder (hardware or software fallback)
|
# Determine HEVC encoder (hardware or software fallback)
|
||||||
self.hevc_encoder = self._detect_hevc_encoder()
|
self.hevc_encoder = self._detect_hevc_encoder()
|
||||||
@@ -578,9 +579,15 @@ class Benchmark:
|
|||||||
avg_fps = sum(job.fps for job in jobs) / len(jobs) if jobs else 0.0
|
avg_fps = sum(job.fps for job in jobs) / len(jobs) if jobs else 0.0
|
||||||
return True, avg_fps
|
return True, avg_fps
|
||||||
|
|
||||||
# If failed, print first error for debugging
|
# If failed, check for NVENC session limit and print debug info
|
||||||
for job in jobs:
|
for job in jobs:
|
||||||
if not job.success and hasattr(job, 'stderr'):
|
if not job.success and hasattr(job, 'stderr'):
|
||||||
|
# Check for NVIDIA session limit error
|
||||||
|
if 'OpenEncodeSessionEx failed' in job.stderr or 'incompatible client key' in job.stderr:
|
||||||
|
self.hit_nvenc_limit = True
|
||||||
|
print(f"✗ (NVIDIA concurrent session limit reached)")
|
||||||
|
return False, 0.0
|
||||||
|
|
||||||
# Skip FFmpeg header and show actual error (last 10 non-empty lines)
|
# Skip FFmpeg header and show actual error (last 10 non-empty lines)
|
||||||
error_lines = [line for line in job.stderr.split('\n') if line.strip()]
|
error_lines = [line for line in job.stderr.split('\n') if line.strip()]
|
||||||
if len(error_lines) > 10:
|
if len(error_lines) > 10:
|
||||||
@@ -644,8 +651,8 @@ class Benchmark:
|
|||||||
print(f"✗ (failed)")
|
print(f"✗ (failed)")
|
||||||
high = mid - 1
|
high = mid - 1
|
||||||
|
|
||||||
# If we have headroom, try one more stream
|
# If we have headroom, try one more stream (unless we hit NVENC limit)
|
||||||
if max_streams > 0:
|
if max_streams > 0 and not self.hit_nvenc_limit:
|
||||||
print(f"Testing {max_streams + 1} simultaneous streams (checking headroom)...", end=' ', flush=True)
|
print(f"Testing {max_streams + 1} simultaneous streams (checking headroom)...", end=' ', flush=True)
|
||||||
success, avg_fps = self.run_parallel_transcodes(max_streams + 1)
|
success, avg_fps = self.run_parallel_transcodes(max_streams + 1)
|
||||||
|
|
||||||
@@ -655,7 +662,8 @@ class Benchmark:
|
|||||||
else:
|
else:
|
||||||
if success:
|
if success:
|
||||||
print(f"✗ (avg {avg_fps:.1f} fps - below real-time)")
|
print(f"✗ (avg {avg_fps:.1f} fps - below real-time)")
|
||||||
else:
|
elif not self.hit_nvenc_limit:
|
||||||
|
# Only print "failed" if we didn't already print NVENC limit message
|
||||||
print(f"✗ (failed)")
|
print(f"✗ (failed)")
|
||||||
|
|
||||||
return max_streams
|
return max_streams
|
||||||
@@ -735,10 +743,21 @@ def main():
|
|||||||
print(f"Transcode Task: 1080p H.264 → 720p H.265")
|
print(f"Transcode Task: 1080p H.264 → 720p H.265")
|
||||||
print(f"Maximum Simultaneous Streams: {max_streams}")
|
print(f"Maximum Simultaneous Streams: {max_streams}")
|
||||||
print(f"(at {args.min_fps} FPS or better)")
|
print(f"(at {args.min_fps} FPS or better)")
|
||||||
|
|
||||||
|
# Show NVIDIA session limit warning if hit
|
||||||
|
if benchmark.hit_nvenc_limit:
|
||||||
|
print("\n⚠ IMPORTANT: Hit NVIDIA driver concurrent session limit!")
|
||||||
|
print(" Your GPU may be capable of more streams, but NVIDIA")
|
||||||
|
print(" GeForce drivers artificially limit concurrent NVENC sessions.")
|
||||||
|
print(" Typical limits: 2-5 sessions (older), 5-8 (RTX 3000/4000)")
|
||||||
|
print(" Quadro/Tesla cards have unlimited sessions.")
|
||||||
|
|
||||||
print("=" * 60)
|
print("=" * 60)
|
||||||
|
|
||||||
# Also output just the number for easy parsing
|
# Also output just the number for easy parsing
|
||||||
print(f"\nBenchmark Score: {max_streams}")
|
print(f"\nBenchmark Score: {max_streams}")
|
||||||
|
if benchmark.hit_nvenc_limit:
|
||||||
|
print("(Limited by NVIDIA driver, not hardware performance)")
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
# Cleanup
|
# Cleanup
|
||||||
|
Reference in New Issue
Block a user