From b99823f24dd359366092ab7b8e2c9a5a9b3b8318 Mon Sep 17 00:00:00 2001 From: Antoine Van Elstraete Date: Sun, 22 Mar 2026 23:50:36 +0100 Subject: [PATCH] =?UTF-8?q?docs:=20mise=20=C3=A0=20jour=20README=20et=20CL?= =?UTF-8?q?AUDE.md=20pour=20AV1+Opus+MKV?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- CLAUDE.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 16 ++++++++------- 2 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..a281f9d --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,60 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Projet + +Script Python standalone de conversion vidéo vers AV1 (libsvtav1) / Opus (libopus) en conteneur MKV, avec sélection automatique du CRF via `ab-av1 crf-search` (VMAF 96), support HDR10/HDR10+, détection de bandes noires, et normalisation audio. + +## Utilisation + +```bash +./vid_convert.py +./vid_convert.py -h # aide +./vid_convert.py -d # mode debug +./vid_convert.py -s # avec stabilisation vidéo +./vid_convert.py -a # tuning animation +./vid_convert.py -c # restauration VHS +./vid_convert.py --interlaced # forcer le désentrelacement (yadif) +``` + +Pas de build, pas de tests, pas de linter configuré. Exécution directe Python 3. + +## Dépendances externes requises + +- `ffmpeg` et `ffprobe` — encodage et extraction de métadonnées (libsvtav1 + libopus requis) +- `ab-av1` — sélection automatique du CRF par crf-search (VMAF 96) +- `mkvmerge` (MkvToolNix) — assemblage du conteneur MKV final +- `hdr10plus_parser` (binaire inclus) — extraction/injection des métadonnées HDR10+ + +## Architecture + +Fichier unique : `vid_convert.py`. Flux d'exécution séquentiel : + +1. **`get_infos(file)`** — ffprobe JSON → métadonnées vidéo/audio/sous-titres, détection HDR10+, Dolby Vision, conteneur source +2. **`cropping(file, infos)`** — cropdetect FFmpeg → suppression des bandes noires +3. **`volume_audio(file, infos)`** — volumedetect FFmpeg → ajustement par piste audio +4. **`find_crf(file, enc_options, hdr)`** — ab-av1 crf-search → CRF optimal pour VMAF 96 +5. **`extract_subs(file, track, lang)`** — extraction des pistes de sous-titres +6. **`convert_audio(...)`** — encodage libopus VBR par piste (128k/320k/450k selon canaux) +7. **`convert_video(...)`** — encodage libsvtav1 (preset=3, tune=0), HDR10/HDR10+ via `-svtav1-params` +8. **`create_mkv(filename)`** — mkvmerge → assemblage MKV final (`NEW_{basename}.mkv`) + +### Points clés + +- Sortie vidéo : `yuv420p10le` (10 bits), encodage en une seule passe +- HDR10 statique : mastering display + content-light via `-svtav1-params` +- HDR10+ : injection native SVT-AV1 via `hdr10plus-json=` dans `-svtav1-params` +- Dolby Vision : détection uniquement, fallback automatique vers HDR10 (Profile 8) ou avertissement (Profile 5) +- Les fichiers temporaires passent par `/tmp/` (métadonnées HDR10+, options mkvmerge JSON) +- Le filtre VHS combine `hqdn3d` + `unsharp` +- La stabilisation utilise `vidstabdetect` + `vidstabtransform` en deux passes + +## Gotchas + +- **libsvtav1 + libopus requis** : le binaire FFmpeg doit être compilé avec `--enable-libsvtav1` et `--enable-libopus`. Vérifier avec `ffmpeg -codecs | grep -E 'svt|opus'`. +- **ab-av1 dans le PATH** : `ab-av1 crf-search` doit être accessible. En cas d'échec, fallback automatique sur CRF 32. +- **Fichier de sortie** : `NEW_{nom_source}.mkv`, généré dans le même répertoire que la source. Les fichiers temporaires (`_video.mkv`, `_audio_*.mka`, `_subtitle_*.mkv`) sont supprimés après assemblage. +- **Fichiers temporaires orphelins** : en cas d'interruption, les intermédiaires peuvent rester dans le répertoire de la source. Les supprimer manuellement si besoin. +- **HDR10+ et conteneur source** : `hevc_mp4toannexb` est appliqué uniquement pour les sources MP4/MOV (pas MKV) lors de l'extraction HDR10+ par `hdr10plus_parser`. +- **`--animation` non fonctionnel** : le flag est parsé mais n'a pas d'effet (tune=0 est utilisé pour tous les contenus). Conservé pour compatibilité future. diff --git a/README.md b/README.md index 693f9a5..7df791f 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,28 @@ # vid_convert vid_convert est un script qui utilise ffmpeg pour convertir des vidéos au -format [H.265](https://fr.wikipedia.org/wiki/H.265/HEVC), avec un audio en -[AAC-LC](https://fr.wikipedia.org/wiki/Advanced_Audio_Coding). +format [AV1](https://fr.wikipedia.org/wiki/AV1) (libsvtav1), avec un audio en +[Opus](https://fr.wikipedia.org/wiki/Opus_(codec_audio)). Cela permet d'optimiser le poids du fichier sans baisse visible de la qualité avec les paramètres prévus dans le script. Le but est de faire un script qui enchaine les différentes opérations, sans laisser à l'utilisateur des choix ou des calculs fastidieux à faire. -Le format de sortie est un fichier MPEG-4 (.mp4), lisible sur n'importe quel -appareil (ou presque) disposant d'une puissance de décodage suffisante. +Le format de sortie est un fichier Matroska (.mkv). Le CRF optimal est +déterminé automatiquement via `ab-av1 crf-search` pour atteindre un VMAF de 96. Le format d'entrée peut être n'importe lequel connu par ffmpeg. Pour les BluRay, -le 4K, HDR et HDR10+ sont gérés. Concernant le son, pas de prise en charge du +le 4K, HDR10 et HDR10+ sont gérés. Concernant le son, pas de prise en charge du canal Atmos, mais le multi-canal (5.1, 7.1, ...) est géré. Toutes les pistes (vidéo, audios et sous-titres) sont conservées. ## Installation et dépendances - [Python](https://www.python.org/) (>= 3.5) - - [ffmpeg](https://ffmpeg.org/) - - [hdr10plus_tool](https://github.com/quietvoid/hdr10plus_tool) + - [ffmpeg](https://ffmpeg.org/) compilé avec `libsvtav1` et `libopus` + - [ab-av1](https://github.com/alexheretic/ab-av1) — sélection automatique du CRF + - [MkvToolNix](https://mkvtoolnix.download/) (`mkvmerge`) — assemblage du conteneur MKV + - `hdr10plus_parser` (binaire inclus) — extraction/injection des métadonnées HDR10+ ## Utilisation