Comme chacun le sait les vidéos de vacances ça fini par prendre une place folle. Mais nous aimons tous conserver tous ce souvenirs pour les partager avec nos enfants et nos amis. Jadis sauvegardées sous la forme de fichiers .AVI, format lancé par Microsoft mais pas très optimisé et obsolète pour de la HD. Aujourd'hui c'est plus souvent le format AVC (H.264) qui est utilisé et que l'on retrouve généralement dans des fichiers .MKV, une sorte de container qui intègre l'audio, la vidéo et les sous-titres dans un seul fichier. Et ce container peut également contenir des vidéos différemment encodées, comme le HEVC (H.265) qui nous intéresse tout particulièrement. Pourquoi cet engouement, simplement parce que l'on va pouvoir facilement diviser par trois la taille des fichiers sans perte de qualité visible et tout en conservant les pistes audio et les sous titres contenus dans le fichier d'origine. Vous l'aurez compris, ceci devient particulièrement intéressant si vous filmez en 4K... (ici par exemple pour en savoir plus).
Comment s'y prendre ?
En matière de vidéo on encode un fichier brut pour réduire sa taille et le rendre transportable et lisible, ensuite on le décode, généralement sur un lecteur, qu'il soit sur un ordinateur, un lecteur de salon (Box, Android TV, Apple TV), un téléviseur moderne qui intègre ces fonctions ou encore un smartphone. Il faut donc s'assurer que le format HEVC soit disponible sur ces appareils, c'est généralement le cas et dans le cas contraire il faudra passer par un serveur, comme Plex ou Emby par exemple, qui assureront le transcodage à la volée pour adapter le flux au lecteur, mais également l'adapter au débit disponible. Bref, la 4K avec un modem 56K ça ne passera pas, et ne ressortez pas votre lecteur de DivX des années 90, ça ne fonctionnera pas non plus.
Si on assemble Décoder et Encoder on obtient Transcoder et c'est ce que nous allons faire pour convertir nos vidéo AVC en vidéos HEVC. Pour y parvenir on trouve comme toujours des logiciels commerciaux, sans intérêt et que je vous conseille vivement d'éviter, et de l'Open Source ou juste Free.
Je ne vais pas faire un tour complet de l'offre mais juste vous parler de mon expérience et de mon parcours. La majorité des solutions sont basées sur FFmpeg ou Handbrake.
- Emby propose une option en un deux clics. C'est pratique, mais il n'y a pas de réglages fins et on perd les sous titres (il y a toutefois possibilité de les extraire à la volée sur un fichier externe). C'est long si on a pas de décodage matériel sur le serveur comme toutes les solutions logicielles.
- FFmpeg Batch Converter est une solution intéressante, elle permet de remplacer directement les fichiers convertis, mais son maniement est assez complexe si l'on sort des préréglages. Je ne l'ai pas trouvé très performant en mode matériel.
- Unmanic semble très bien, tout comme Tdar qui est solution distribuée que j'ai trouvé bluffante sur le papier, mais je n'ai pas de carte graphique là ou je pourrais monter ces dockers. Je n'ai donc pour l'instant pas testé.
- HandBrake s'est par contre rapidement imposé. Son interface est relativement claire et intuitive et les performances sont au rendez-vous, notamment avec une carte graphique Intel Iris Xe que l'on trouve dans les laptop récents (2 minutes pour convertir un fichier de 4 Go). Et je suppose que l'on peut faire bien mieux avec une bonne carte graphique du genre Nvidia Quadro ou RTX. Je vais donc continuer avec HandBrake.
Mais, car il y a un mais, HandBracke ne sait pas de base exclure des fichiers, ni parcourir une arborescence récursive ou encore simplement remplacer les fichiers d'origine par les fichiers fois convertis. Afin de contourner ces restrictions il existe HandBrake CLI que l'on peut scripter. J'ai trouvé quelques scripts qui me donnaient pas vraiment envie, puis je suis tombé sur HBBatchBeast qui est un GUI pour HandBrake CLI et FFmpeg/FFprobe (Windows, macOS et Linux (+Docker image). De prime abord ça ne donne vraiment pas envie, c'est très moche et son auteur n'est assurément pas un fin designer. Mais j'ai toutefois installé et ça fait le job plutôt bien.
Je vais donc m'en servir en me basant sur les presets que j'ai adaptés à mon usage. En gros je conserve tous paramètres de la vidéo d'origine, ses pistes audio avec l'encodage d'origine et également les sous-titres.
Sous HandBrake je vais affiner ces réglages en partant sur le préréglage matériel H.265 QSV 1080p, je n'ai pas touché aux réglages proposés pour la vidéo, au niveau de l'audio je choisit d'ajouter toutes les langues proposées et le mode Auto Passthru au niveau codec et je fais de même pour les sous titres. Pour faire simple je choisit de conserver tous les caractéristiques du fichier d'origine. En vrai j'ai un peu galéré et trouvé un peu d'aide ici.
A partir de là on fait quelques tests avec HandBrake et on teste la lecture sur plusieurs appareils afin de voir si le résultat est à la hauteur, et notamment sur des appareils exigeants, un téléviseur 4K de grande taille ou un projecteur...
Et quand on est content du résultat on exporte le préréglage dans un fichier .json (vous trouverez, je ne vais pas vous tenir la main).
{
"PresetList": [
{
"AlignAVStart": false,
"AudioCopyMask": [
"copy:aac",
"copy:ac3",
"copy:dtshd",
"copy:dts",
"copy:truehd",
"copy:eac3"
],
"AudioEncoderFallback": "none",
"AudioLanguageList": [
"any"
],
"AudioList": [
{
"AudioBitrate": 160,
"AudioCompressionLevel": 0,
"AudioEncoder": "copy",
"AudioMixdown": "stereo",
"AudioNormalizeMixLevel": false,
"AudioSamplerate": "auto",
"AudioTrackQualityEnable": false,
"AudioTrackQuality": -1,
"AudioTrackGainSlider": 0,
"AudioTrackDRCSlider": 0
}
],
"AudioSecondaryEncoderMode": true,
"AudioTrackSelectionBehavior": "all",
"ChapterMarkers": true,
"ChildrenArray": [],
"Default": true,
"FileFormat": "av_mkv",
"Folder": false,
"FolderOpen": false,
"Mp4HttpOptimize": false,
"Mp4iPodCompatible": false,
"PictureAutoCrop": false,
"PictureBottomCrop": 0,
"PictureLeftCrop": 0,
"PictureRightCrop": 0,
"PictureTopCrop": 0,
"PictureDARWidth": 0,
"PictureDeblockPreset": "off",
"PictureDeblockTune": "medium",
"PictureDeblockCustom": "strength=strong:thresh=20:blocksize=8",
"PictureDeinterlaceFilter": "off",
"PictureCombDetectPreset": "off",
"PictureCombDetectCustom": "",
"PictureDenoiseCustom": "",
"PictureDenoiseFilter": "off",
"PictureDenoisePreset": "medium",
"PictureDenoiseTune": "none",
"PictureSharpenCustom": "",
"PictureSharpenFilter": "off",
"PictureSharpenPreset": "medium",
"PictureSharpenTune": "none",
"PictureDetelecine": "off",
"PictureDetelecineCustom": "",
"PictureColorspacePreset": "off",
"PictureColorspaceCustom": "",
"PictureChromaSmoothPreset": "off",
"PictureChromaSmoothTune": "none",
"PictureChromaSmoothCustom": "",
"PictureItuPAR": false,
"PictureKeepRatio": true,
"PictureLooseCrop": false,
"PicturePAR": "auto",
"PicturePARWidth": 0,
"PicturePARHeight": 0,
"PictureWidth": 1920,
"PictureHeight": 1080,
"PictureUseMaximumSize": true,
"PictureAllowUpscaling": false,
"PictureForceHeight": 0,
"PictureForceWidth": 0,
"PicturePadMode": "none",
"PicturePadTop": 0,
"PicturePadBottom": 0,
"PicturePadLeft": 0,
"PicturePadRight": 0,
"PresetName": "Convert to HEVC 3",
"Type": 1,
"SubtitleAddCC": false,
"SubtitleAddForeignAudioSearch": false,
"SubtitleAddForeignAudioSubtitle": false,
"SubtitleBurnBehavior": "none",
"SubtitleBurnBDSub": false,
"SubtitleBurnDVDSub": false,
"SubtitleLanguageList": [
"any"
],
"SubtitleTrackSelectionBehavior": "all",
"VideoAvgBitrate": 0,
"VideoColorMatrixCode": 0,
"VideoEncoder": "qsv_h265",
"VideoFramerateMode": "vfr",
"VideoGrayScale": false,
"VideoScaler": "swscale",
"VideoPreset": "speed",
"VideoTune": "",
"VideoProfile": "auto",
"VideoLevel": "auto",
"VideoOptionExtra": "",
"VideoQualityType": 2,
"VideoQualitySlider": 22,
"VideoQSVDecode": true,
"VideoQSVAsyncDepth": 0,
"VideoTwoPass": false,
"VideoTurboTwoPass": false,
"x264UseAdvancedOptions": false,
"PresetDisabled": false,
"MetadataPassthrough": true
}
],
"VersionMajor": 47,
"VersionMicro": 0,
"VersionMinor": 0
}
A ce stade on passe sur HBBatchBeast. Oui je sais, c'est moche et déroutant, mais promis ça ne fait pas mal. Voici les réglages à renseigner à minima :
- Source folders : la racine de l'arborescence de fichiers à convertir. Tout en haut et facilement adaptable.
- Destination folders : la destination des conversion. On verra plus loin qu'ils peuvent êtres déplacés pour remplacer les fichiers source.
- Choisir si on travaille avec HandBrake ou FFmpeg. On coche le premier.
Ensuite on peut choisir de travailler avec les préréglages standard de HandBarke ou de renseigner sous cette forme notre réglage personnalisé précédemment exporté :
--preset-import-file "C:\Users\Lionel.Canaletto\Documents\HBBatchBeast\HEVC3.json" -Z "Convert to HEVC 3"
On continue avec :
- Le container :
.MKV
en ce qui nous concerne
- On coche "advanced"
- On peut ensuite exclure certains types de fichiers de part leur nom (.jpg, etc...), leur taille ou d'autres options...
- On choisit ensuite si on veut remplacer les fichiers d'origine.
Vous verrez qu'il existe une multitude d'options qui vont permettre d'optimiser le processus, notamment l'utilisation d'un temporaire répertoire local si on travaille sur des disques distants.
Encore une fois c'est moche, mais ce qui compte c'est que ça fonctionne très bien, rapide (9.45" pour 8 fichiers de 1 Mo sur un disque distant via Internet en SMB3), et que c'est adapté à mon besoin. Et merci à ceux qui m'ont aidé ou donné des pistes.
Sources