Update transcode_bench.py

This commit is contained in:
2025-10-12 19:51:39 +13:00
parent b5aa5b948b
commit 4b245ee5bd

View File

@@ -25,40 +25,56 @@ class HardwareAcceleration:
Returns: (name, encoder, hwaccel_args) Returns: (name, encoder, hwaccel_args)
""" """
# Check NVIDIA NVENC # Check NVIDIA NVENC
if HardwareAcceleration._check_encoder('h264_nvenc'): if HardwareAcceleration._test_hardware('h264_nvenc', '-hwaccel cuda -hwaccel_output_format cuda'):
return ('NVIDIA NVENC', 'h264_nvenc', '-hwaccel cuda -hwaccel_output_format cuda') return ('NVIDIA NVENC', 'h264_nvenc', '-hwaccel cuda -hwaccel_output_format cuda')
# Check Intel QSV # Check Intel QSV
if HardwareAcceleration._check_encoder('h264_qsv'): if HardwareAcceleration._test_hardware('h264_qsv', '-hwaccel qsv -hwaccel_output_format qsv'):
return ('Intel Quick Sync', 'h264_qsv', '-hwaccel qsv -hwaccel_output_format qsv') return ('Intel Quick Sync', 'h264_qsv', '-hwaccel qsv -hwaccel_output_format qsv')
# Check AMD AMF (Windows/Linux) # Check AMD AMF (Windows/Linux)
if HardwareAcceleration._check_encoder('h264_amf'): if HardwareAcceleration._test_hardware('h264_amf', ''):
return ('AMD AMF', 'h264_amf', '') return ('AMD AMF', 'h264_amf', '')
# Check VideoToolbox (macOS/iOS - ARM) # Check VideoToolbox (macOS/iOS - ARM)
if HardwareAcceleration._check_encoder('h264_videotoolbox'): if HardwareAcceleration._test_hardware('h264_videotoolbox', '-hwaccel videotoolbox'):
return ('VideoToolbox', 'h264_videotoolbox', '-hwaccel videotoolbox') return ('VideoToolbox', 'h264_videotoolbox', '-hwaccel videotoolbox')
# Check VA-API (Linux Intel/AMD) # Check VA-API (Linux Intel/AMD)
if HardwareAcceleration._check_encoder('h264_vaapi'): if HardwareAcceleration._test_hardware('h264_vaapi', '-hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device /dev/dri/renderD128'):
return ('VA-API', 'h264_vaapi', '-hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device /dev/dri/renderD128') return ('VA-API', 'h264_vaapi', '-hwaccel vaapi -hwaccel_output_format vaapi -hwaccel_device /dev/dri/renderD128')
# Fallback to software # Fallback to software
return ('Software (libx264)', 'libx264', '') return ('Software (libx264)', 'libx264', '')
@staticmethod @staticmethod
def _check_encoder(encoder: str) -> bool: def _test_hardware(encoder: str, hwaccel_args: str) -> bool:
"""Check if FFmpeg supports a specific encoder.""" """Test if hardware encoder is actually available by attempting to use it."""
try: try:
# Build a quick test encode command
cmd = ['ffmpeg', '-y', '-hide_banner', '-loglevel', 'error']
# Add hardware acceleration args if present
if hwaccel_args:
cmd.extend(hwaccel_args.split())
# Generate 1 frame of test video and try to encode it
cmd.extend([
'-f', 'lavfi',
'-i', 'testsrc2=size=1920x1080:duration=0.1:rate=1',
'-frames:v', '1',
'-c:v', encoder,
'-f', 'null',
'-' if os.name != 'nt' else 'NUL'
])
result = subprocess.run( result = subprocess.run(
['ffmpeg', '-hide_banner', '-encoders'], cmd,
capture_output=True, capture_output=True,
text=True, timeout=10
timeout=5
) )
return encoder in result.stdout return result.returncode == 0
except (subprocess.TimeoutExpired, FileNotFoundError): except (subprocess.TimeoutExpired, FileNotFoundError, Exception):
return False return False