#!/bin/bash # ============================================================================= # COMPRESSION DES RUSHS POUR LE WEB # # Pour chaque rush de /rushs, deux fichiers dans /videos : # .mp4 1080p HEVC (tag hvc1) — qualité, ~40 % plus léger que H.264 # _mobile.mp4 720p H.264 (tag avc1) — chargé par défaut, lisible partout # # Un rush dont les deux sorties existent et sont lisibles est sauté # (FORCE=1 pour refaire). # # Variables : # JOBS=N rushs encodés en parallèle (défaut : cœurs performance / 4) # THREADS=N threads par encodeur (défaut : cœurs / JOBS) # ENCODER=cpu libx265 + libx264, meilleure qualité par octet (défaut) # ENCODER=vt VideoToolbox, ~10× plus rapide sur Apple Silicon, un peu # moins bon à taille égale ; JOBS=1 (un seul bloc matériel) # PRESET=medium preset x264/x265 # CRF_HEVC=26 qualité du 1080p (échelle x265) # CRF_H264=25 qualité du 720p (échelle x264, PAS comparable à x265) # VTQ_HD=60 VTQ_SD=58 qualité VideoToolbox (1-100, plus haut = meilleur) # FPS_MAX=60 plafond de fréquence d'images (un rush 120p est ramené à 60) # FORCE=1 réencode même si les sorties existent # # Exemples (depuis le dossier du voyage) : # ../../RoadTripsGenerator/Scripts/compress.sh # JOBS=1 ../../RoadTripsGenerator/Scripts/compress.sh # avec barre de progression # ENCODER=vt ../../RoadTripsGenerator/Scripts/compress.sh # ============================================================================= set -uo pipefail shopt -s nocaseglob nullglob # --- Mode interne : rappelé par xargs pour traiter UN rush --------------------- if [ "${1:-}" = "--encode-one" ]; then INTERNAL=1 BASE_DIR="${RT_BASE_DIR:-.}" TARGET="${2:?--encode-one attend un fichier}" else INTERNAL=0 BASE_DIR="${1:-.}" fi SOURCE_DIR="$BASE_DIR/rushs" DEST_DIR="$BASE_DIR/videos" # --- Configuration ----------------------------------------------------------- ENCODER="${ENCODER:-cpu}" PRESET="${PRESET:-medium}" CRF_HEVC="${CRF_HEVC:-26}" CRF_H264="${CRF_H264:-25}" VTQ_HD="${VTQ_HD:-60}" VTQ_SD="${VTQ_SD:-58}" FPS_MAX="${FPS_MAX:-60}" FORCE="${FORCE:-0}" # Sur Apple Silicon on ne compte que les cœurs performance : les cœurs # d'efficience ralentiraient tout le pool de threads x265. detect_cores() { local c="" c=$(sysctl -n hw.perflevel0.logicalcpu 2>/dev/null); [ -n "$c" ] && { echo "$c"; return; } c=$(sysctl -n hw.logicalcpu 2>/dev/null); [ -n "$c" ] && { echo "$c"; return; } c=$(nproc 2>/dev/null); [ -n "$c" ] && { echo "$c"; return; } echo 4 } CORES="${CORES:-$(detect_cores)}" JOBS_EXPLICIT=0 [ -n "${JOBS+x}" ] && JOBS_EXPLICIT=1 if [ "$ENCODER" = "vt" ] && [ "$JOBS_EXPLICIT" = "0" ]; then JOBS=1 else JOBS="${JOBS:-$(( CORES / 4 ))}" fi [ -z "$JOBS" ] && JOBS=1 [ "$JOBS" -lt 1 ] 2>/dev/null && JOBS=1 THREADS="${THREADS:-$(( CORES / JOBS ))}" [ "$THREADS" -lt 2 ] 2>/dev/null && THREADS=2 # Le 720p H.264 est 3 à 5× plus rapide que le 1080p HEVC : moitié moins de threads. THREADS_SD=$(( THREADS / 2 )) [ "$THREADS_SD" -lt 2 ] && THREADS_SD=2 # --- Encodage d'un palier ---------------------------------------------------- # encode