Vous êtes ici : Accueil Zaclys Astuces / Les rubriques / Informatique / Logiciel / Vidéo

Voir un article

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 :

  1.     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)
  2.     Stream #0:1(eng): Subtitle: dvd_subtitle, 1920x1080
  3.     Stream #0:2(fre): Subtitle: dvd_subtitle, 1920x1080
  4.     Stream #0:3(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
  5.     Stream #0:4(eng): Subtitle: subrip
  6.     Stream #0:5(fre): Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s (default) (forced)
  7.     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



7 184 clics - Créé le 05/03/2016 par Tito - Modifié le 29/03/2016



Réagissez, commentez, discutez ...

InfoSoyez le premier à réagir !


(sert uniquement à vous signaler les réactions)




Partager ?

diaspora  G+  facebook  twitter  Digg  Yahoo  Delicious  Technorati  myspace


Voir d'autres articles en rapport avec celui-ci ?



Stats des clics sur cet article : cliquez ici »



Vous voulez contribuer et publier un article dans cette rubrique ?

InfoMerci de vous identifier ou de vous créer un compte si ce n'est pas déjà fait.


icone user Me connecter :

InfoMerci de saisir vos identifiants.




Me reconnecter automatiquement à chaque visite sur ce navigateur :
               





retour






Plan du site | Aide | Mentions légales et CGU | RGPD | Travaux et incidents | Budget | Faire un don | Chouchen | Z pub | Logo et prospectus

© Association la mère Zaclys 1998-2019  - Zaclys v2.5

Suivez nous sur Diaspora, Mastodon, Google+, FaceBook ou Twitter