Update transcode_bench.py
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user