diff --git a/Dockerfile b/Dockerfile index cae87a8..ee6dc84 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,14 @@ FROM node:20-alpine # Install build dependencies for better-sqlite3 and FFmpeg for streaming # Using system FFmpeg instead of ffmpeg-static for better Docker DNS compatibility -RUN apk add --no-cache python3 make g++ ffmpeg +# Hardware acceleration packages: +# - mesa-va-gallium: AMD VAAPI (Radeon/Vega) +# - intel-media-driver: Intel VAAPI/QSV (newer Intel GPUs) +# - libva-intel-driver: Intel VAAPI (older Intel GPUs, Haswell-Skylake) +# - libva-utils: vainfo tool for debugging +# Note: NVIDIA requires nvidia-container-toolkit on host + --gpus flag +RUN apk add --no-cache python3 make g++ ffmpeg \ + mesa-va-gallium intel-media-driver libva-intel-driver libva-utils WORKDIR /app diff --git a/server/services/transcodeSession.js b/server/services/transcodeSession.js index c43ef35..77ca99c 100644 --- a/server/services/transcodeSession.js +++ b/server/services/transcodeSession.js @@ -17,6 +17,7 @@ const path = require('path'); const fs = require('fs').promises; const crypto = require('crypto'); const EventEmitter = require('events'); +const hwDetect = require('./hwDetect'); // Session storage const sessions = new Map(); @@ -166,9 +167,16 @@ class TranscodeSession extends EventEmitter { */ buildFFmpegArgs() { const segmentPattern = path.join(this.dir, 'seg%04d.m4s'); - const encoder = this.options.hwEncoder || 'software'; const videoMode = this.options.videoMode || 'encode'; + // Resolve 'auto' encoder to detected hardware, fallback to software + let encoder = this.options.hwEncoder || 'software'; + if (encoder === 'auto') { + const hwCaps = hwDetect.getCapabilities(); + encoder = hwCaps?.recommended || 'software'; + console.log(`[TranscodeSession ${this.id}] Auto encoder resolved to: ${encoder}`); + } + const args = [ '-hide_banner', '-loglevel', 'warning',