Manipulation, archivage et conversion de vidéo

Je vais compiler ici toute les informations qui me servent en manipulation de vidéo.

Source

Résolution standard

  • 720 x 480 [DVD]
  • 1280 x 720 [HD]
  • 1920 x 1080 [Full HD]
  • 3840 x 2160 [UHD-4K]
  • 7680 x 4320 [UHD-8K]

ffmpeg

On peut lister les codecs utilisables par son installation de ffmpeg.

ffmpeg -codecs

Ou encore les formats de sortie.

ffmpeg -formats

Autre point important. Le périphérique qui va afficher le fichier de sortie. J’ai un smartphone qui a une résolution de 480p sur 5 pouces. Une vidéos affiché en 240p garde un rendu acceptable pour moi. C’est important de le savoir. Par ce que je vais pouvoir encoder des vidéos au dimension adéquate pour mon smartphone et gagné énormémant d’espace disque.

Il faut aussi connaitre les capacités de la machine cible. Si on reste sur le smartphone, il est incapable de lire correctement une vidéo en h265 ce qui est dommage, car du h265 en 240p ça en pèse pas lourd du tout…

Edition des metadata d’un avi

Pour editer les metadatas d’un AVI, il faut le réencoder… ici, je supprimer certain champ et je valorise le champ titre.

ffmpeg -i FICHIER_ENTREE.avi -metadata artist="" -metadata copyright="" -metadata comment="" -metadata ISBJ="" -metadata title="TITRE DESIREE" -acodec copy -vcodec copy FICHIER_SORTIE.avi

Suppression des metadatas d’un fichier

ffmpeg -i in.mov -map_metadata -1 -c:v copy -c:a copy out.mov

Conversion d’une vidéo en h264

On conserve l’audio et on redimensionne la vidéo en 720p.

ffmpeg -i MyMovie.mkv -vf scale=-1:720 -c:v libx264 -crf 0 -preset veryslow -c:a copy MyMovie_720p.mkv
  • crf 0, on est en lossless (très long), moyenne à 23
  • veryslow, un preset haute qualité, moyenne à medium

Conversion h265 10bit vers h264 8bit

ffmpeg -y -i MyMovie.mkv -vf "scale=-1:ceil(ih/8)*2,format=yuv420p" -c:v libx264 -crf 23 -preset fast -c:a copy MyMovie_240p.mkv;
  • scale=-1:ceil(ih/8)*2, -1 pour conserver le ratio, ih hauteur de la source, on divise par 8, on arrondi au superieur et on multiplie par 2 pour etre sur d’avoir un nombre paire et obtient une division par 4 forcément paire…
  • format=yuv420p, qui permet de ne pas bugger à la conversion des pixels.

idem en h265

Le codec libx264 devient libx265.

A qualité équivalente, h265 sort des fichiers beaucoup plus petit (3x plus petit lors de mes tests) en revanche, il faut beaucoup plus de temps pour encoder. Autre desavantage, nos machines actuellement ne sont pas doté de puce de décompression h265.

Convertir un avi en mkv

ffmpeg -i input_video.avi -f matroska -vcodec libx265 -acodec libvorbis output_video.mkv

Convertion d’un flux vidéo type avi ou mp4 en mkv avec ajout de sous titre

ffmpeg -i "fichier_vidéo_source.mp4" -c:v copy -c:a copy -c:s "fichier_sub.srt" "fichier_de_sortie.mkv"

Extraction d’une piste audio

ffmpeg -i MOVIE_IN.mkv -vn -ac 1 -f opus AUDIO_OUT.opus

Suppression d’une piste audio

La suppression des pistes audio non utilisé est un bon moyen pour gagner de l’espace disque.

On commence par chercher l’id du stream

ffmpeg -i FIC_IN.mkv

On recherche les lignes du type :

Stream #0:0(fre): Audio: ac3, 48000 Hz, 5.1(side), fltp, 320 kb/s (default)

L’ID du stream est #0:0.

Puis on réencode en précisant les streams que l’on souhaite conserver avec -map:

ffmpeg -i FIC_IN.mkv -map 0:1 -map 0:2 -vcodec copy -acodec copy FIC_OUT.mkv

Conversion d’un stream audio ac3 en mp3 stéréo

ffmpeg -i FIC_IN.mkv -c:v copy -c:s copy -c:a:0 libmp3lame -b:a:0 128k FIC_OUT.mkv
  • -c:v copy, indique qu’on copie les streams vidéos
  • -c:s copy, indique qu’on copie les streams de soustitre
  • -c:a:0 libmp3lame, indique qu’on va convertir le premier stream audio
  • -b:a:0 128k, indique qu’on défini le biterate pour le premier stream audio

La selection du stream dépendant de l’ordre des stream audio et pas du ID du stream parmis tout les streams.

La page map de la doc ffmpeg pour référence.

modification des metadonnées spécifique d’un stream

ffmpeg -i FIC_IN.mkv -c:v copy -c:s copy -c:a copy -metadata:s:a:0 title="MP3-2.0" FIC_OUT.mkv

-metadata:s:a:0, on precise que l’on va éditer les metadatas avec -metadata le :s présise la selection par stream et pour finir a:0 pour préciser le stream.

Ajout d’un SRT à un MKV

ffmpeg -i input.mkv -sub_charenc 'UTF-8' -f srt -i subs.en.srt -map 0 -c:v copy -c:a copy -c:s srt output.mkv

Extraction d’un morceau d’une vidéo

ffmpeg -ss 00:00:30 -i orginalfile.mkv -t 00:05:00 -vcodec copy -acodec copy newfile.mkv

ici on va commencer l’extraction à 30s du début et elle va durer 5min. pas de modification sur l’encodage.

Rotation d’une vidéo prise au smartphone pour la passer en horizontale

source

ffmpeg -i in.mp4 -filter_complex '[0:v]scale=ih*16/9:-1,boxblur=luma_radius=min(h\,w)/20:luma_power=1:chroma_radius=min(cw\,ch)/20:chroma_power=1[bg];[bg][0:v]overlay=(W-w)/2:(H-h)/2,crop=h=iw*9/16' out.mp4

Passage d’une vidéo en 60 fps

source

Ces methodes ajoute des images donc le fichier de sortie est fatalement plus volumineux…

Methode 1: interpolation

ffmpeg \
  -i input.mp4 \
  -crf 10 \
  -vf "minterpolate=fps=60:mi_mode=mci:mc_mode=aobmc:me_mode=bidir:vsbmc=1" \
  output.60fps.mp4

mono processeur.

Methode 2: Blur

ffmpeg \
  -i input.mp4 \
  -crf 10 \
  -filter:v tblend -r 60 \
  output.60fps.mp4

la methode 2 est multiprocesseur.

RIP de dvd

  • Il faut disposer de la librairie libdvdcss de videolan.
  • avec une interface graphique : handbrake
  • en cli, c’est plus compliqué…

Le défaut principale de handbrake et que la source doit être disponible dans le lecteur dvd… handbrake peut travailler par lot mais il faudra faire un dump des dvd au préalable… ce qui est également nécessaire en cli.

dump d’un dvd

trouver le titre recherché

lsdvd -as

faire le dump

mplayer dvd://${num_titre} -alang fr,en -slang en,fr -dumpstream -dumpfile FICHIER_OUT.mpeg
  • num_titre, correspond au numéros du titre à extraite.
  • alang, gère les flux audio en spécifiant l’ordre de préférence des langues
  • slang, gère les sous titre en specifiant l’ordre de préférence des langues

On peut aussi utiliser vobcopy -m pour archiver le dvd.

Extraction des sub en SRT

mplayer -vobsub nom_sub_sans_extention fichier.avi

Conversion

On peut réaliser l’extraction et la conversion à la volé avec handbrake ou mencoder. Ici le but est de travailler en ligne de commande sur un fichier existant.

On utilise donc ffmpeg avec les options vu précédement.

Je recommande très fortement les conteneurs mkv parce qu’il sont plutot simple a utiliser. modifier la synchro des pistes audio/vidéo/sous titre ne nécessite pas un réencodage de la vidéo par exemple.

mkvtoolnix

C’est groupe d’outil pour manipuler les mkv.

On l’installe sous debian avec la commande :

apt install mkvtoolnix

mkvtoolnix-gui est une interface graphique à mkvtoolnix.

editer les metadatas

mkvpropedit mon_fichier --edit info --set "title=mon titre"

petit script pour initialiser les titres à la valeur du nom du fichier :

IFS="
"
for film in $(ls -1 *mkv)
do
  echo "---"
  echo $film
  titre=$(basename $film .mkv)
  echo $titre
  mkvpropedit $film --edit info --set "title=${titre}"

done
IFS=" "

décalage audio

mkvmerge -o output.mkv --sync [audio track ID]:[number of ms] input.mkv

modification des piste par défaut

On repère les pistes avec mkvinfo. On positionne le flag à zéros pour désactiver la selection.

Pour les pistes audio :

mkvpropedit filename --edit track:a1 --set flag-default=0 --edit track:a2 --set flag-default=0 --edit track:a3 --set flag-default=1

Ici pour les sous-titre :

mkvpropedit filename --edit track:s1 --set flag-default=0 --edit track:s2 --set flag-default=0

le script suivant va retirer de chaque fichier présent dans le répertoire courant le flag qui est mis par defaut sur la piste sub 1. ce qui permet de faire que les sous titre ne soit pas automatiquement chargé.

IFS="
"
for film in $(ls -1 *mkv)
do
  echo "---"
  echo $film
  mkvpropedit "${film}" --edit track:s1 --set flag-default=0

done
IFS=" "