Manipulation, archivage et conversion de vidéo
Je vais compiler ici toute les informations qui me servent en manipulation de vidéo.
Source
- Artisan Numérique j’ai pour ainsi dire pomper toute la partie sur mplayer. Le site est une perle mais semble abandonné depuis 4 ans. C’est donc une façon pour moi d’archiver son contenu.
- sebsauvage pas mal de recopie ici aussi. C’est toujours vivant mais j’archive… ça parle ffmpeg
- github - ffmpeg - SRT dans MKV
- programster - mkvtoolnix
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
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
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=" "