Linux : convertir une vidéo H265 (HEVC) en H264 classique
Le nouveau codec H265 permet un taux de compression énorme, on peut ainsi récupérer une vidéo en 1080p dans un fichier 2x plus petit qu'avant ce qui permet des transferts par internet beaucoup plus rapides.
Mais les TV et autres lecteurs vidéos ne savent pas encore lire ce nouveau format... Une astuce consiste tout simplement à utiliser ffmpeg pour les reconvertir en H264 classique.
1/ Installez ffmpeg
2/ ouvrez votre explorateur de fichier (ici testé avec Dolphin sous Linux KDE) , allez dans le dossier qui contient votre fichier vidéo H265 à convertir
3/ Ouvrez un shell (touche F4 sur Dolphin) et tapez :
i="LE NOM DE VOTRE VIDEO H265.mkv"
Astuce : vous pouvez utiliser la complétude (touche tab) pour vous aider à saisir, ou même glisser-déposer le fichier sur la fenêtre shell pour copier son emplacement
4/ Lancer ffmpeg pour convertir cette vidéo en précisant les streams à conserver :
ffmpeg
-hwaccel vdpau -i "$i" -bsf:v h264_mp4toannexb -map 0 -vcodec libx264 -acodec copy -c:s copy "$i.ts"
NB : laissez mijoter, quand c'est fini renommez le fichier XXX.ts obtenu en XXX.mp4 (qui est plus conventionel)
Remarque : on force le codec video en h264 (-vcodec libx264 , vcodec signifie vidéo codec), mais on laisse les streams audio et les streams de sous titres tels quels (-acodec copy pour audio codec copy , et -c:s copy pour préciser que les streams s (subtitle) seront également simplement copiés)
- en fonction de la puissance de votre PC ça va prendre + ou - longtemps, si vous avez une carte graphique très récente qui intégre la décompression H265 matérielle, ffmpeg va en profiter et ça va grandement accélérer le traitement
- pour info sur un quad core Q8200 2.33ghz (cpu de 2007) sans accélération matérielle, ça prend en moyenne 1.5x la durée du film (dans ce cas le bilan électrique de l'opération est discutable...)
5/ Pour faire la même chose sur plusieurs vidéos H265 :
(en admettant que tous les fichiers XXX.mkv et XXX.MKV du dossier sont concernés)
cd LE_DOSSIER
for i in *.mkv *.MKV;do
ffmpeg
-hwaccel vdpau-i "$i" -bsf:v h264_mp4toannexb -map 0 -vcodec libx264 -acodec copy -c:s copy "$i.ts"
mv "$i.ts" "$i.mp4"
done
6/ Accélération matérielle :
Certaines carte graphiques permettent la décompression/décodage H265 matérielle et/ou la compression/encodage H264 matérielle ... La Nvidia GTX 960 par exemple permet les 2.
Pour connaitres les capacités de votre carte graphique, lancez "nvidia-settings" depuis un shell ou à la souris depuis les paramètres système , et cliquez dans le menu de gauche sur VDPAU (en gros c'est un protocole de communication entre linux et nvidia) , vous verrez la liste des codecs supportés par votre GPU, le H264 est présent par exemple sur la Nvidia GT720.
Sachant que d'autres outils comme VLC passent par VDPAU pour faire de la décompression matérielle de vos vidéos.
Maintenant pour en profiter sur ffmpeg il faut activer/installer le décoder et l'encoder adéquat pour utiliser le GPU à la place du CPU.
a) L'option -hwaccel vdpau activera le décodage matériel H265 (si votre GPU le permet comme expliqué ci-dessus), en général en utilisant le décodeur matériel standard pour linux : VDPAU (video decode api unix) , c'est le plus simple si votre version de linux/ffmpeg/gpu sont assez récents , pour le savoir :
ffmpeg -hwaccels
qui doit afficher :
Hardware acceleration methods:
vdpau
b) Pour utiliser l'encoder matériel H264 pour nividia il faut utiliser l'encodeur spécifique "nvenc_h264" développé par nvidia pour ffmeg (baptisé nvenc pour nvidia encoder) , il faudra faire un peu de cuisine pour recompiler ffmpeg avec ce plugin, vous trouverez toutes les infos ici avec une doc pdf pour ubuntu : https://developer.nvidia.com/ffmpeg
Ensuite il suffira de préciser l'option -vcodec nvenc (au lieu de -vcodec libx264)
Astuce :
ffmpeg -codecs vous permet de connaitres les décodeurs/encodeurs disponibles sur votre version , par exemple sur une GT720
je trouve cette ligne intéressante sur le H264 :
DEV.LS h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (decoders: h264 h264_vdpau ) (encoders: libx264 libx264rgb )
j'ai 2 décodeur dispo sur le h264 : "h264" qui va utiliser le cpu et "h264_vdpau" qui va utiliser , si vous avez suivi les explications ... le gpu
Pour en savoir + sur l'accélération matérielle avec ffmpeg :
https://trac.ffmpeg.org/wiki/HWAccelIntro
7/ Pour aller plus loin
Il est possible de ne pas prendre tous les streams ( = flux ou pistes) du fichier et de sélectionner uniquement la langue de votre choix, car dans un fichier vidéo multiplexé , que ce soit mkv mp4 ou avi, il y a souvent un stream vidéo, plusieurs streams audio (anglais, français etc), et plusieurs flux de sous titre (audio description etc)
ffprobe "$i" 2>&1 |grep Stream
Résultat :
- Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv), 1920x816, SAR 1:1 DAR 40:17, 23.98 fps, 23.98 tbr, 1k tbn, 23.98 tbc (default)
- Stream #0:1(eng): Subtitle: dvd_subtitle, 1920x1080
- Stream #0:2(fre): Subtitle: dvd_subtitle, 1920x1080
- Stream #0:3(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
- Stream #0:4(eng): Subtitle: subrip
- Stream #0:5(fre): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s (default) (forced)
- Stream #0:6(fre): Subtitle: subrip
Ici je suis preneur pour le stream vidéo en ligne 1 qui porte la référence "0:0" , et le stream audio en ligne 6 qui porte la référence "0:5" et qui est en français, le "(fre)" signifie french. On voit que par défaut ffmpeg va prendre le stream audio "english" en ligne 4 puisqu'il précède.
Est-ce qu'on a besoin de conserver les streams de sous titre (subtitle) ? tout dépend, il y a les streams de sous titres "traduction full" dans diverses langues, qui sont souvent inutiles, et il y a les streams sous titres de traduction utiles qui s'affichent juste quand on a un passage en langue étrangère pour avoir la traduction dans notre langue ... ici en ligne 3 et 7 j'ai deux streams de sous titres en "french" (fre) , de format "dvd_subtitle" et "subrip" ... mon astuce pour savoir si c'est utile : j'ouvre la vidéo avec VLC et j'active/désactive les stream de sous titre via le menu "sous titres" / "pistes des sous titres", je vais retrouver les 4 streams de sous titres ci dessus (en bleu) ...
Remarque : les streams 0:0 et 0:5 identifiés et choisis sont passés en paramètres "-map" sur la ligne de commande , au lieu de -map 0 (qui demande à ffmpeg de prendre tous les flux) , on précisera -map 0:0 -map 0:5
9 132 clics - Créé le 05/03/2016 par Tito - Modifié le 29/03/2016