Auteur Sujet: Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !  (Lu 17663 fois)

0 Membres et 1 Invité sur ce sujet

vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Attention ce tutoriel est aujourd'hui dépassé.

Comment réduire le poids de ses vidéos en les ré-encodant en AV1 / 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, tout en gardant la qualité de Youtube en 720p ?

On va faire un exercice pratique : J'ai filmé les questions /réponses de la conférence de presse SFR.
Cela me fait une vidéo de 18min 45sec.

En H.264 1080p, mon appareil photo me fait un fichier de 2832,88 Mo (audio avec codec AAC 48 kHz)
=> Débit moyen de 20,15 Mb/s.

J'ai uploadé la vidéo sur Youtube. Voici la taille optimisée par Youtube :
- H.264 1080p : 315,29 Mo soit 2,242 Mb/s (audio avec codec AAC 44,1 kHz)
- H.264 720p : 188,85 Mo soit 1,343 Mb/s (audio avec codec AAC 44,1 kHz)
- VP9 1080p : 173,34 Mo soit 1,233 Mb/s (audio avec codec Opus 48 kHz)
- VP9 720p : 152,17 Mo soit 1,082 Mb/s (audio avec codec Opus 48 kHz)

J'ai testé en compressant en AV1 en 720p, voici la taille de mon fichier :
- AV1 720p : 26,17 Mo soit 0,186 Mb/s (audio avec codec Opus 48 kHz)


Oui, mon fichier d'origine est passé de 2833 Mo en H.264 1080p à 26 Mo en AV1 720p !



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

J'utilise Ubuntu 19.04. AV1 étant tout récent, la version de ffmpeg livrée avec Ubuntu 18.04 LTS ne supporte pas libaom-av1.
Une version de ffmpeg récent est disponible dans un "snap" pour toutes les verisons d'Ubuntu, mais il n'est pas compilé avec libaom-av1.
=> seule solution Ubuntu 19.04 en utilisant ffmpeg disponible dans les dépots.

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 libaom-av1 -crf 44 -b:v 0 -row-mt 1 -tiles 4x1 -strict experimental -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 libaom-av1 : Codec vidéo de destination. libaom-av1 encode en AV1.
-crf 44 : 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.
-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
-row-mt 1 : active le multi-threading basé sur les lignes qui optimise l'utilisation du processeur
-tiles 4x1 : Pour permettre des performances de décodage rapides, ajoute des mosaïques 4x1 pour 4 mosaïques.
-strict experimental : Le codage AV1 est considéré comme expérimental à ce stade. Par conséquent, l'utilisation de -strict experimental (ou de l'alias -strict -2) est nécessaire.

-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 AV1 / Opus

vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #1 le: 04 août 2019 à 22:30:55 »
Vous souhaiter regarder la qualité ?

Le fichier test sur Youtube :


- H.264 1080p : 315,29 Mo soit 2,242 Mb/s (audio avec codec AAC 44,1 kHz)
- H.264 720p : 188,85 Mo soit 1,343 Mb/s (audio avec codec AAC 44,1 kHz)
- VP9 1080p : 173,34 Mo soit 1,233 Mb/s (audio avec codec Opus 48 kHz)
- VP9 720p : 152,17 Mo soit 1,082 Mb/s (audio avec codec Opus 48 kHz)





Le fichier AV1 720p : 26,17 Mo soit 0,186 Mb/s (audio avec codec Opus 48 kHz)




vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #2 le: 04 août 2019 à 22:38:56 »
Quels navigateurs supportent AV1 ?

Firefox, Chrome et Opéra sur PC.
Aucun navigateur sur smartphone ne supporte AV1

=> https://caniuse.com/#feat=av1






Quelle vitesse pour encoder en AV1 ?

Avec un Core i7-2600 @3.40GHz, j'encode à la vitesse Speed : 0,00205x

Pour mon fichier de 18min 45 secondes en 720p que j'encode en AV1 il faut ... une semaine !

Mon micro-processeur n'est pas tout récent et il est connu que libaom-av1 n'est pas du tout optimisé pour faire le travail rapidement.
Des optimisations seront faites les prochaines années.

Pour le codec VP9, j'ai noté un gain de vitesse de plus de 30% entre Ubuntu 18.04 et Ubuntu 16.04 sur un vieux CPU AMD.

hwti

  • Abonné Orange Fibre
  • *
  • Messages: 2 237
  • Chambly (60)
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #3 le: 05 août 2019 à 02:41:00 »
Les tailles des fichiers YouTube ne semblent pas correctes, avec youtube-dl j'obtiens :
 - VP9 720p : 128Mo
 - opus 16,5Mo
Donc je n'arrive pas aux 152Mo indiqués (et en plus le fait que l'opus soit à 160kbps fausse la comparaison puisque tu réencodes l'audio et la vidéo).

Certes, le choix de format audio de YouTube est bizarre :
 - AAC-SBR (mp4a.40.5) à 48kbps
 - AAC-LC (mp4a.40.2) à 128kbps
 - opus à 160kbps

Les bitrates de YouTube sont ici très importants compte tenu de la vidéo qui comporte très peu de mouvement.

Le seek sur la vidéo AV1 est très lent et consommateur de CPU (que ce soit avec Firefox, Chrome, VLC).
"ff_probe -select-streams v -show_frames 201907_sfr_box8_conference_presse_questions.webm" me donne key_frame=1 tout le temps, ce qui semble être un bug.
Avec "ffprobe -of compact -select_streams v -show_packets 201907_sfr_box8_conference_presse_questions.webm | grep flags=K", je ne vois que 3 key frames, avec un intervalle de 9999 frames soit 400s !
Du coup je comprend la vitesse de seek, s'il faut décoder jusqu'à 400s de vidéo...

La comparaison est donc probablement faussée par ce point, sachant que YouTube encode de manière à pouvoir découper en segments (MSE), et faire un seek suffisamment rapide.
Par exemple, le VP9 720p de YouTube (format 247 pour youtube-dl) a des key frames toutes les 5,12s (soit 128 frames).


Free_me

  • Abonné Free fibre
  • *
  • Messages: 3 113
  • Marseille
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #4 le: 05 août 2019 à 06:53:39 »
quelques remarques :
tu peux extraire quelques frames a heure fixe, ca permet plus facilement de comparer la qualité lorsqu'on teste. Enfin bon, a 1 semaine le test j'imagine que c'est affreux. Exemple 1 frame pa toutes les 600 sec : ffmpeg.exe -i source.mp4 -vf fps=1/600 result_%04d.png
Il y a effectivement un soucis sur les keyframe
Il n'y a pas de gestion de 'profiles' avec av1 ?
Si tu compares les tailles, sur un sujet sur l'av1, il faudrait donner la taille du flux video uniquement, là on melange les choux et les carottes
crf 44, je trouve ca tres bas (enfin elevé). Et pourtant c'est ultra determinant, je ne sais pas ce que choisit youtube comme methode (qualité constante ou bitrate moyen) mais faudrait donner l'info car s'ils sont en crf 18, ben c'est clair que passer a 44.....

vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #5 le: 05 août 2019 à 07:05:34 »
Ne prendre que la vidéo, c'est vendeur, mais tout ce qui t'intéresse c'est vidéo+audio, non ?

Effectivement le fichier manque de keyframe.
On fait comment pour en rajouter ?
https://trac.ffmpeg.org/wiki/Encode/AV1 ne le mentionne pas.

Les tailles des fichiers YouTube ne semblent pas correctes, avec youtube-dl j'obtiens :
 - VP9 720p : 128Mo
 - opus 16,5Mo
Donc je n'arrive pas aux 152Mo indiqués (et en plus le fait que l'opus soit à 160kbps fausse la comparaison puisque tu réencodes l'audio et la vidéo).

J'ai bien utilisé Youtube -DL pour récupérer les fichiers, mais je parle en Mo et non pas Mio.
Youtube-DL parle en Mio.

Pour le 720p, j'utilise 247+251, j'ai un fichier de 152 168 596 octets.
$ youtube-dl -F https://www.youtube.com/watch?v=t_haWvI0c00
[youtube] t_haWvI0c00: Downloading webpage
[youtube] t_haWvI0c00: Downloading video info webpage
[youtube] t_haWvI0c00: Downloading MPD manifest
[info] Available formats for t_haWvI0c00:
format code  extension  resolution note
139          m4a        audio only DASH audio   50k , m4a_dash container, mp4a.40.5@ 48k (22050Hz)
251          webm       audio only DASH audio  130k , webm_dash container, opus @160k (48000Hz)
140          m4a        audio only DASH audio  131k , m4a_dash container, mp4a.40.2@128k (44100Hz)
278          webm       256x144    DASH video   95k , webm_dash container, vp9, 25fps, video only
160          mp4        256x144    DASH video  108k , mp4_dash container, avc1.4d400b, 25fps, video only
242          webm       426x240    DASH video  220k , webm_dash container, vp9, 25fps, video only
133          mp4        426x240    DASH video  242k , mp4_dash container, avc1.4d400c, 25fps, video only
243          webm       640x360    DASH video  405k , webm_dash container, vp9, 25fps, video only
134          mp4        640x360    DASH video  526k , mp4_dash container, avc1.4d401e, 25fps, video only
244          webm       854x480    DASH video  752k , webm_dash container, vp9, 25fps, video only
135          mp4        854x480    DASH video 1155k , mp4_dash container, avc1.4d4014, 25fps, video only
247          webm       1280x720   DASH video 1505k , webm_dash container, vp9, 25fps, video only
136          mp4        1280x720   DASH video 2310k , mp4_dash container, avc1.4d4016, 25fps, video only
248          webm       1920x1080  DASH video 2646k , webm_dash container, vp9, 25fps, video only
137          mp4        1920x1080  DASH video 4235k , mp4_dash container, avc1.640028, 25fps, video only
43           webm       640x360    medium , vp8.0, vorbis@128k, 82.77MiB
18           mp4        640x360    medium  384k , avc1.42001E, mp4a.40.2@ 96k (44100Hz), 51.65MiB
22           mp4        1280x720   hd720 1265k , avc1.64001F, mp4a.40.2@192k (44100Hz) (best)


Optix

  • AS41114 - Expert OrneTHD
  • Abonné Orne THD
  • *
  • Messages: 4 667
  • WOOHOO !
    • OrneTHD
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #6 le: 05 août 2019 à 09:48:12 »
Oh punaise, dès qu'on tape au milieu de la vidéo AV1, le CPU grimpe à fond, et les ventilos se préparent à un décollage  ;D

Belle prouesse technique, plus qu'à attendre les optimisations ça viendra tout doucement  ;)

hwti

  • Abonné Orange Fibre
  • *
  • Messages: 2 237
  • Chambly (60)
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #7 le: 05 août 2019 à 11:24:59 »
Oh punaise, dès qu'on tape au milieu de la vidéo AV1, le CPU grimpe à fond, et les ventilos se préparent à un décollage  ;D

Belle prouesse technique, plus qu'à attendre les optimisations ça viendra tout doucement  ;)
Là c'est surtout le manque de keyframes.
Avec le même intervalle de 9999 frames, en H264 ou VP9 ce serait long aussi (un peu moins bien sûr, le décodage étant plus rapide).

hwti

  • Abonné Orange Fibre
  • *
  • Messages: 2 237
  • Chambly (60)
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #8 le: 05 août 2019 à 11:43:48 »
Ne prendre que la vidéo, c'est vendeur, mais tout ce qui t'intéresse c'est vidéo+audio, non ?
Le titre du sujet suggère qu'on ne parle que des gains de l'AV1 (certes la première ligne mentionne Opus).

Effectivement le fichier manque de keyframe.
On fait comment pour en rajouter ?
https://trac.ffmpeg.org/wiki/Encode/AV1 ne le mentionne pas.
D'après https://ffmpeg.org/ffmpeg.html, -force_key_frames expr:gte(t,n_forced*5) pour une toutes les 5s (soit on fait comme YouTube en VP9, mais en acceptant un temps de seek plus long, soit il faudrait réduire pour tenir compte de la lourdeur du décodage).

J'ai bien utilisé Youtube -DL pour récupérer les fichiers, mais je parle en Mo et non pas Mio.
Youtube-DL parle en Mio.
Ah, OK  :)

underground78

  • Expert
  • Abonné Free fibre
  • *
  • Messages: 7 436
  • Orsay (91)
    • FreePON : suivi géographique du déploiement fibre EPON chez Free
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #9 le: 05 août 2019 à 19:47:08 »
Ça serait intéressant de voir ce qui se passe si tu joues avec la compression h264, à mon avis tu peux garder une qualité correcte en descendant pas mal le débit sur une scène fixe comme ça.

daleksek

  • Abonné Orange Fibre
  • *
  • Messages: 1 362
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #10 le: 12 août 2019 à 02:46:51 »
bizarre que ça n'utilise pas tout le CPU lors de l'encodage

vivien

  • Administrateur
  • *
  • Messages: 47 183
    • Twitter LaFibre.info
Tutoriel pour encoder AV1 et réduire une vidéo de 3 Go à 30 Mo !
« Réponse #11 le: 12 août 2019 à 08:28:45 »
Pour l'encodage AV1, il utilise les 4 cœurs, mais on a l'impression que les 4 cœurs ont des taches différentes à traiter et quand un cœur a terminé son opération, il attend que tous les cœurs aient terminées pour recevoir la tache suivante.

Pour voir une utilisation CPU moyenne, j'ai paramétré avec une mise à jour toutes les 20 secondes, on a donc un moyenne (si on met un intervalle de temps plus courts, cela fait 100% un certain temps puis 0% si on met à jour plus rapidement)



C'est un CPU 4 cœurs / 8 threads (Core i7-2600 @3.40GHz)