Auteur Sujet: Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus  (Lu 29920 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Comment réduire le poids de ses vidéos en les ré-encodant en VP9 / Opus ?

Vous avez peut-être une caméra qui filme en full HD ou en 4k. C'est sympa, mais les fichiers sont très lourds. Si vous avez besoin de mettre vos vidéos sur un blog familial, la taille pose probablement problème. Vous souhaitez réduire sensiblement la taille (débit de 1 à 1,5 Mb/s), tout en gardant la qualité de Youtube en 720p ?

On va utiliser ffmpeg qui va réduire la résolution à 720p, encoder la vidéo en VP9 (le codec le plus efficace supporté par les navigateurs web) et l'audio avec le codec Opus, le codec audio le plus efficace)

Installation : sudo apt install ffmpeg libavcodec-extra

Voici la ligne de commande à utiliser pour une compression en une seule passe :
ffmpeg -i source.mp4 -vf scale=1280:-1 -c:v libvpx-vp9 -b:v 0 -crf 40 -threads 4 -speed 1 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 64k -f webm destination.webm


Détail des options utilisées :
-i source.mp4 : fichier source
-vf scale=1280:-1 : Option pour changement la résolution => résolution cible (-1 garde le ratio rappel: 1920×1080 = 1280×720 = 16/9)
-c:v libvpx-vp9 : Codec vidéo de destination. libvpx-vp9 encode en VP9.
-b:v 0 : Débit maximum, pour une qualité constante (déterminée par crf), il faut le mettre à 0. Pour mettre une limite haute du débit à 1 Mb/s c'est -b:v 1000K
-crf 40 : Qualité perçue : la valeur CRF peut être entre 0 et 63. Des valeurs plus faibles signifient une meilleure qualité. 32 à 45 = iso Youtube. Si on souhaite encoder à débit fixe, il ne faut pas mettre cette option. Il est toutefois plus pertinent d'encoder à une qualité perçue fixe, plutôt que un débit fixe.
-threads 4 :  Encodage sur 4 threads en parallèle. SI vous avez 8 cœurs physiques, vous pouvez utiliser -threads 8. Sans cette option, l'encodage n'utilise qu'un seul cœur et est malheureusement assez lent.
-speed 1 : Compromis entre vitesse de compression et qualité. speed 1, la valeur par défaut, produit qualité de sortie très proche de la vitesse speed 0, mais speed 1 encode généralement beaucoup plus vite que speed 0. Pour un encodage en deux passe, on speed 4 est un bon compromis pour la première passe. Les valeurs possible vont de -16 a 16.
-tile-columns 6 -frame-parallel 1 : Permet de créer un ficher vidéo qui pourra être lu en multi-threaded (coté client). -tile-columns 6 -frame-parallel 1 sont les valeurs par défaut.
-auto-alt-ref 1 : Le décodeur va choisir en fonction du contenu quand prendre une image de référence (image fixe complètement décrite, alors que les autres images codent ce qui a changé par rapport à l'image précédente ou à l'image suivante). concrètement a chaque changement de plan, une image de référence sera insérée.
-lag-in-frames 25 : nombre d'images à regarder vers l'avenir pour l'encodage , 0 aucune limite. [min 0 - max 25]

-c:a libopus : Codec audio de destination (avec libopus il y a par déault -vbr on -compression_level 10)
-b:a 64k : Débit cible 64 Kb/s (Youtube encode dans 3 débits théoriques : 50 Kb/s , 70 Kb/s et 160 Kb/s en réalité on est un peu en dessous).
-f webm : Force le format de sortie en webm
destination.webm : fichier destination compressé en VP9 / Opus


Voici les lignes de commande à utiliser pour une compression en deux passes (permettant d'avoir une meilleure qualité pour un même débit) :
ffmpeg -i source.mp4 -vf scale=1280:-1 -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 40 -threads 4 -tile-columns 6 -frame-parallel 1 -an -f webm -y /dev/null
ffmpeg -i source.mp4 -vf scale=1280:-1 -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 40 -threads 4 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 64k -f webm destination.webm


Détail des nouvelles options utilisées :
-pass 1 : Le numéro de passe (1 ou 2). Les statistiques de la vidéo de la première passe sont enregistrées dans un fichier journal (PREFIX-N.log où N est un nombre spécifique au flux de sortie).
-an : désactiver audio qui est inutile pour la première passe
/dev/null : la sortie NULL sous Linux/ Unix / MacOS X pour ne pas enregistrer le fichier vidéo généré. Sous Windows, il faut utiliser NUL
-y : na pas avertir que le fichier existe déjà (sans ça, on a la question "File '/dev/null' already exists. Overwrite ?")


J'ai testé la compression du flux 1080p H.264 en 720p VP9/Opus de deux vidéos :
- PSY - GANGNAM STYLE => Il faut mettre la qualité à 43 (-crf 43) pour avoir un fichier 720p VP9 de la taille de celui de Youtube
- Michael Jackson - Hold My Hand => Il faut mettre la qualité à 33 (-crf 33) pour avoir un fichier 720p VP9 de la taille de celui de Youtube

Youtube n'encode pas à débit constant (les vidéos qui bougent beaucoup utilisent plus de débit que les vidéo avec une image fixe) mais pas uniquement à qualité constante, vu que quand on choisit ce mode, on voit que le paramètre qualité varie sensiblement pour avoir une taille iso Youtube.

Quels sont les navigateurs qui supportent VP9 + Opus ?
- Google Chrome / Chromium
- Opéra
- Mozilla Firefox (sous Linux depuis Firefox 43 et sous Windows, à partir de Firefox 47, qui sort le 7 juin 2016)
- Microsoft Edge (a partir de Windows 10 anniversary update, qui sort fin juillet 2016)
- Android 5, sortie en 2014 mais pas encore sur tous les téléphones.
Tous les processeurs, même ceux qui ont 8an d'age,  arrivent à décoder logiciellement le 720p en VP9 / Opus

Safari gère Opus depuis 2012, mais par le codec VP9  :(




Comparatif des codec audios (enfin il manque l'AC3) :

fab67

  • Abonné SFR THD (câble)
  • *
  • Messages: 71
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #1 le: 17 mai 2016 à 19:57:06 »
ici des paramètres complèmentaires : http://wiki.webmproject.org/ffmpeg/vp9-encoding-guide

et notamment -threads 8  -tile-columns 6 pour la vitesse
et  -auto-alt-ref 1 -lag-in-frames 25 pour la qualité

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #2 le: 31 mai 2016 à 16:24:50 »
Merci pour le lien.

Plusieurs paramètres sont des paramètres par défaut de libvpx-vp9 1.4.0:
- profile=0
- threads=0
- quality=good (deadline=1000000)
- cpu-used=1 (-cpu-used = -speed)
- frame-parallel=1
- tile-columns=6
- auto-alt-ref=1
- lag-in-frames=25
- aq-mode=0
- kf_max_dist=9999 (-g)

Par contre "-threads 4" est nécessaire pour l'avoir 4 threads. J'ai mis à jour mon premier message avec les optimisations proposées.

Faut-il faire une passe ou deux passe quand on encode à une qualité perçue fixe ? J'étais persuadé que la double passe était pour les encodage avec une limitation de débit (débit fixe ou qualité + débit maximum) mais non : il y  a aussi un gain pour un encodage avec une qualité perçue fixe. J'imagine que c'est grâce à un meilleur placement des images de références (images i) et je suis étonné d'avoir un gain significatif.

J'ai testé une vidéo tout simple (non montée) et récente pour voir la qualité d'un encodage Youtube 720p VP9 en partant d'un flux 1080p H264.



- Fichier Youtube 1080p H.264 30images par secondes : 52,6 Mo
- Fichier Youtube 720p VP9 30images par secondes : 18,8 Mo
- Encodage 720p VP9 double passe qualité crf 40 depuis 1080p H.264 (lignes de commande plus haut) : 17,9 Mo
- Encodage 720p VP9 double passe qualité crf 39 depuis 1080p H.264 (lignes de commande plus haut) : 19,5 Mo
- Encodage 720p VP9 double passe qualité crf 33 depuis 1080p H.264 (lignes de commande plus haut) : 28,1 Mo

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #3 le: 31 mai 2016 à 19:56:50 »
Compresser via une commande tous les fichiers de votre appareil photo (à exécuter la nuit)

Script bash pour compresser toutes les vidéos .MP4 du dossier où est exécuté le script et réduire leur résolution en 720p :

for i in *.MP4 ; do
    ((n++))
    date '+===> %kh%M %Ssec: Vidéo N°'$n' Passe 1/2 '$i' => '${i/.MP4}'.webm'
    ffmpeg -i "$i" -vf scale=1280:-1 -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 40 -threads 4 -speed 4 -tile-columns 6 -frame-parallel 1 -an -loglevel warning -f webm -y /dev/null
    date '+===> %kh%M %Ssec: Vidéo N°'$n' Passe 2/2 '$i' => '${i/.MP4}'.webm'
    ffmpeg -i "$i" -vf scale=1280:-1 -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 40 -threads 4 -speed 1 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 64k -loglevel warning -f webm -y "${i/.MP4}".webm
done
date '+===> %kh%M %Ssec: Encodage vidéo VP9 terminé'


Script bash pour compresser toutes les vidéos .MOV du dossier où est exécuté le script et réduire leur résolution en 720p :

for i in *.MOV ; do
    ((n++))
    date '+===> %kh%M %Ssec: Vidéo N°'$n' Passe 1/2 '$i' => '${i/.MOV}'.webm'
    ffmpeg -i "$i" -vf scale=1280:-1 -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 40 -threads 4 -speed 4 -tile-columns 6 -frame-parallel 1 -an -loglevel warning -f webm -y /dev/null
    date '+===> %kh%M %Ssec: Vidéo N°'$n' Passe 2/2 '$i' => '${i/.MOV}'.webm'
    ffmpeg -i "$i" -vf scale=1280:-1 -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 40 -threads 4 -speed 1 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 64k -loglevel warning -f webm -y "${i/.MOV}".webm
done
date '+===> %kh%M %Ssec: Encodage vidéo VP9 terminé'


Les fichiers traités sont numérotés (pour estimer où en est le script) et l'heure affichée à chaque étape.
J'ai rajouté -loglevel warning pour n'afficher que les avertissement / erreurs.
En cas de fichier destination déjà existant, le fichier est supprimé (option -y)

jack

  • Professionnel des télécoms
  • *
  • Messages: 1 602
  • La Madeleine (59)
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #4 le: 31 mai 2016 à 23:19:59 »
Deux petits commentaires:
Citer
Voici les lignes de commande à utiliser pour une compression en deux passes (permettant d'avoir une meilleure qualité pour un même débit)
Le double passe n'est utile que si tu as des contraintes de bitrate à respecter
Sinon, le vbr est ce qui te donne le meilleur résultat

Citer
-crf 40 : Qualité perçue : la valeur CRF peut être entre 0 et 63. Des valeurs plus faibles signifient une meilleure qualité. 32 à 45 = iso Youtube. Si on souhaite encoder à débit fixe, il ne faut pas mettre cette option. Il est toutefois plus pertinent d'encoder à une qualité perçue fixe, plutôt que un débit fixe.
C'est vraiment le crf utilisé par youtube ? Il est un peu .. viril, disons

kgersen

  • Modérateur
  • Abonné Orange Fibre
  • *
  • Messages: 9 230
  • Paris (75)
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #5 le: 01 juin 2016 à 00:07:11 »
Perso je les upload brut sur youtube en privé. puis ensuite les download dans la résolution et codec (vp9 ou h264) qui m’intéressent grace a youtube-dl.


vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #6 le: 01 juin 2016 à 07:07:12 »
Mes vidéos sur Youtube (peu de vues) n'ont pas de VP9 :

$ youtube-dl -F https://www.youtube.com/watch?v=dgHNWfwE3mM
[youtube] dgHNWfwE3mM: Downloading webpage
[youtube] dgHNWfwE3mM: Downloading video info webpage
[youtube] dgHNWfwE3mM: Extracting video information
[youtube] dgHNWfwE3mM: Downloading MPD manifest
[youtube] dgHNWfwE3mM: Downloading MPD manifest
[info] Available formats for dgHNWfwE3mM:
format code  extension  resolution note
140          m4a        audio only DASH audio  130k , m4a_dash container, mp4a.40.2@128k (44100Hz)
160          mp4        256x144    DASH video  108k , avc1.4d400b, 25fps, video only
133          mp4        426x240    DASH video  242k , avc1.4d400c, 25fps, video only
134          mp4        640x360    DASH video  604k , avc1.4d401e, 25fps, video only
135          mp4        854x480    DASH video 1155k , avc1.4d4014, 25fps, video only
136          mp4        1280x720   DASH video 2310k , avc1.4d4016, 25fps, video only
137          mp4        1920x1080  DASH video 4331k , avc1.64001e, 25fps, video only
36           3gp        320x?      small , mp4v.20.3,  mp4a.40.2
17           3gp        176x144    small , mp4v.20.3,  mp4a.40.2@ 24k
5            flv        400x240    small , h263, mp3  @ 64k
43           webm       640x360    medium , vp8.0,  vorbis@128k
18           mp4        640x360    medium , avc1.42001E,  mp4a.40.2@ 96k
22           mp4        1280x720   hd720 , avc1.64001F,  mp4a.40.2@192k (best)


kgersen

  • Modérateur
  • Abonné Orange Fibre
  • *
  • Messages: 9 230
  • Paris (75)
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #7 le: 01 juin 2016 à 07:15:08 »
Effectivement ca a du changé avec le nombre de vue. Ca peut se comprendre vu les ressources cpu que ca prend pour convertir en vp9.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #8 le: 01 juin 2016 à 07:57:39 »
Deux petits commentaires:Le double passe n'est utile que si tu as des contraintes de bitrate à respecter
Moi aussi, je pensais ça.

Le site officiel recommande 2 passes : http://wiki.webmproject.org/ffmpeg/vp9-encoding-guide

J'ai donc testé avec la vidéo Michael Jackson - Hold My Hand en source le 1080p H264 et en destination du VP9 720p avec la qualité 43

1 passe : 20,7 Mo
Ligne de commande :
ffmpeg -i source.mp4 -vf scale=1280:-1 -c:v libvpx-vp9 -b:v 0 -crf 43 -threads 4 -speed 1 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 64k -f webm destination.webm

2 passes : 17,8 Mo

Lignes de commande :
ffmpeg -i source.mp4 -vf scale=1280:-1 -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 43 -threads 4 -speed 4 -tile-columns 6 -frame-parallel 1 -an -f webm -y /dev/null
ffmpeg -i source.mp4 -vf scale=1280:-1 -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 43 -threads 4 -speed 1 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 64k -f webm destination.webm

Il y a donc un gain, même si je ne m'explique pas pourquoi. Le placement des images de référence est mieux optimisé ?

jack

  • Professionnel des télécoms
  • *
  • Messages: 1 602
  • La Madeleine (59)
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #9 le: 01 juin 2016 à 09:58:19 »
Hoh, c'est très intéressant ça
Je me note de faire des tests pour savoir si c'est spécifique au codec

Merci de l'info Vivien!

underground78

  • Expert
  • Abonné Free fibre
  • *
  • Messages: 7 445
  • Orsay (91)
    • FreePON : suivi géographique du déploiement fibre EPON chez Free
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #10 le: 01 juin 2016 à 13:42:39 »
En théorie le type des images est choisi lors de la première passe et ne change plus ensuite.

  • Invité
Encoder des vidéos HD720 à 1 Mb/s grâce au codec VP9 / Opus
« Réponse #11 le: 01 juin 2016 à 15:57:45 »
Je ne sais plus trop pourquoi,vérifiez les changelog, mais j'ai eu à recompiler ffmpeg dernièrement.