Table des matières
- Outils de conversion des formats vidéo et audio (ogg, ogv, mp4, webm, mp3, flv, etc...)
- Diffusion multimédia : flv, h264, mkv, mp3, mp4, ogg, ogv, webm... ?
- ffmpeg2theora : conversion de MP4 vers OGG (Theora & Vorbis)
- ffmpeg2theora : conversion de FLV vers OGG (Theora & Vorbis)
- FFmpeg : conversion de MP4 ou FLV vers Webm (VP8 & Vorbis)
- FFmpeg : conversion de AVI vers MP4 (mpeg4)
- Script d'encodage de MP4 et FLV vers le format Webm / VP8
- Webm : documentation et outils du codec VP8
- Convertir les fichiers audio MP3 en fichiers audio OGG
- Encodage vidéo : problèmes rencontrés
Diffusion vidéo : encodage MP4 ou FLV vers Webm (VP8 & Vorbis)
Date de publication: le samedi 12 novembre 2011 à 13h27
Dernière modification: par Pascal BOYER le jeudi 2 février 2012 à 22h59
FFmpeg pour convertir une vidéo de MP4 ou FLV vers Webm (VP8 & Vorbis)
Le 19 Mai 2010, Google annonce une décision encouragée par la FSF (Free Software Foundation): Placer l'algorithme de compression VP8 sous licence libre.
Qu'est-ce que Webm ?
En peu de mots on peut résumer ainsi Webm: un conteneur multimédia dérivé du conteneur mkv et qui utilise exclusivement l'algorithme VP8 pour la compression vidéo et exclusivement l'algorithme Vorbis pour la compression audio.
:
Webm est tout particulièrement adapté au streaming via HTML 5
:
Si votre site est réalisé avec eZ Publish, alors je vous recommande la lecture de ce petit article:
eZ Publish : comment afficher les vidéos Webm
Pour celles et ceux qui souhaitent approfondir leurs connaissances de Webm:
Vous trouverez sur le net (en anglais) des tests comparatifs des algorithmes h.264 et Webm. Je n'ai pas lu ces documents. En revanche, cet été, une news a retenu mon attention qui pour moi en dit suffisamment sur la qualité de VP8:
Webm implémenté dans FFmpeg
Une fois Webm placé sous licence libre, rien ne venait plus s'opposer à son implémentation dans les distributions Linux. C'est ainsi que le 15 Juin 2010 la version 0.6 de FFmpeg voit le jour et implémente le codec VP8 de Google.
Dès lors, et comme nous allons le voir, l'encodage des vidéos au format Webm devient un jeu... redoutablement efficace !
Si vous souhaitez afficher la liste impressionnante des codecs supportés par FFmpeg, tapez cette commande:
ffmpeg -codecs
Pour afficher la liste des codecs Vidéo capables de Décoder et d'Encoder (DEV), utilisez cette commande:
ffmpeg -codecs |grep DEV
Pour afficher la liste des codecs Audio capables de Décoder et d'Encoder (DEA), utilisez cette commande:
ffmpeg -codecs |grep DEA
FFmpeg : encoder une vidéo au format webm avec les codecs VP8 (vidéo) et Vorbis (audio)
Si le terme Bitrate (Taux d'échantillonage) n'évoque rien chez vous, je vous recommande la lecture de la première partie de ce précédent article:
Cliquer sur l'image pour lancer les vidéos
Taille de la vidéo: 27 930 650 octets
Bitrate vidéo: 700
Bitrate audio: 96
Taille de la vidéo: 33 353 426 octets pour un résultat passable
-speed 0
-rc_lookahead 16
-keyint_min 0
-g 360
-skip_threshold 0
-level 116
-vcodec libvpx
-b 700k
-ab 96k
-s 640x480
Taille de la vidéo: 27 686 635 octets
Avoir une vague notion de ce qu'est un Taux d'échantillonnage semble un minimum lorsque l'on souhaite encoder des fichiers multimédia audio / vidéo
Quelques paramètres d'encodage utilisés avec ffmpeg
- -ab : est suivi du Bitrate audio souhaité
- -acodec : est suivi du codec audio (libvorbis pour Vorbis)
- -ar : est suivi de la fréquence d'échantillonnage audio (44100 par exemple)
- -b : est suivi du Bitrate vidéo souhaité
- -i : est suivi du fichier original
- -s : est suivi de la taille souhaitée (largeur x hauteur - e.g: 848x480) de la vidéo
- -threads : est suivi du nombre de coeurs CPU utilisés
- -vcodec : est suivi du nom du codec utilisé (libvpx pour VP8)
- -aspect : est suivi du ratio souhaité pour la vidéo (des valeurs possibles: 4:3, 16:9, 1.3333 ou 1.7777)
Optimisation de l'encodage avec ffmpeg
- -rc_lookahead 16 : permet au codec de regarder les prochaines images pour adapter ces paramètres en conséquence.
- -g 360 : création d'une image de référence toutes les 360 images.
- -level 116 : mode lent qui active des améliorations graphiques (temps d'encodage alors plus long). Autres valeurs possibles pour gagner du temps d'encodage (mais qualité moindre): 216 ou 214
- -speed 0 : permet, sans perte de qualité, de réduire la taille finale du fichier en contre partie d'un temps d'encodage beaucoup plus long. Intervalle de valeur [-16, 16]
2. Encode Quality vs. Speed / Qualité d'encodage VS Vitesse
In general, the more time the encoder spends coding each frame the better the job it will do, though it is very much a case of diminishing returns.
En règle générale, plus l'encodeur passe de temps à encoder chaque frame, meilleur est le résultat produit. Mais cela engendre bien évidemment une baisse du rendement.
The basic speed control parameters in VP8 are as follows:
Les paramètres de base du contrôle de la vitesse d'encodage de VP8 sont les suivants:
| --best |
This usually gives the best quality output but is extremely slow. In general this is not a recommended setting unless you have a lot of time on your hands. Ce paramètre est celui qui donne la meilleure qualité mais il est en contre partie extrêmement lent. Il n'est donc en général pas recommandé à moins de disposer de beaucoup de temps. |
| --good |
This will probably be what most users use most of the time. Within the scope of "good" quality there are 6 further speed steps that are set through the --cpu-used parameter (values from 0 to 5). Setting --good quality and --cpu-used=0 will give quality that is usually very close to and even sometimes better than that obtained with --best but the encoder will typically run about twice as fast. Setting --cpu-used=1 or --cpu-used=2 will give further significant boosts to encode speed, but will start to have a more noticeable impact on quality and may also start to effect the accuracy of the data rate control. Setting a value of 4 or 5 will turn off "rate distortion optimisation" which has a big impact on quality, but also greatly speeds up the encoder. Ce paramètre est probablement celui que les utilisateurs choisissent le plus couramment. La qualité «good» propose 6 niveaux de vitesse, tous définis par le paramètre --cpu-used (valeur comprise entre 0 et 5). Définir une qualité --good et --cpu-used=0 engendrera un niveau de qualité souvent très proche, voire meilleur, que celui obtenu avec --best et ceci avec un encodeur tournant environ deux fois plus vite. --cpu-used=1 ou --cpu-used=2 permettent d'augmenter la vitesse d'encodage de manière significative mais engendrent un début d'altération de la qualité et peuvent également affecter la précision du contrôle du débit. Quant aux valeurs 4 et 5, elles bloquent l'«optimisation de la distorsion du débit/taux», ce qui impacte grandement la qualité mais accroît en revenche considérablement la vitesse d'encodage. |
| --rt |
Real-time mode allows the encoder to auto adjust the speed vs. quality trade-off in order to try and hit a particular cpu utilisation target. In this mode the --cpu-used parameter controls the %cpu target as follows: target cpu utilisation = (100*(16-cpu-used)/16)%
Legal values for -cpu-used when combined with --rt mode are (0-15). It is worth noting that in --rt mode the encode quality will depend on how hard a particular clip or section of a clip is and how fast the encoding machine is. In this mode the results will thus vary from machine to machine and even from run to run depending on what else you are doing. |
| --cpu-used |
The meaning depends on the mode above. Negative values are for debug and force specific internal speed configurations. Le sens de ce paramètre dépend des modes ci-dessus. Les valeurs négatives sont réservées au débogage et permettent de forcer des configurations particulières de la vitesse interne. |
saut de ligne
ffmpeg -i masques_3.mp4 -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k -s 640x480 masques_3.webm
ffmpeg version 0.8.5, Copyright (c) 2000-2011 the FFmpeg developers
built on Oct 24 2011 07:32:40 with gcc 4.6.1
configuration: --prefix=/usr --extra-cflags='-Wall -g ' --cc='ccache cc' --enable-shared --enable-libmp3lame --enable-gpl --enable-nonfree --enable-libdirac --disable-decoder=libdirac --enable-libvorbis --enable-pthreads --enable-libfaac --enable-libxvid --enable-postproc --enable-x11grab --enable-libgsm --enable-libtheora --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libx264 --enable-libspeex --enable-nonfree --disable-stripping --enable-libschroedinger --disable-encoder=libschroedinger --enable-version3 --enable-libopenjpeg --enable-libvpx --enable-librtmp --enable-avfilter --enable-frei0r --enable-libopencv --enable-libfreetype --enable-libvo-aacenc --disable-decoder=amrnb --enable-libvo-amrwbenc --enable-libaacplus --libdir=/usr/lib/x86_64-linux-gnu --enable-libdc1394 --disable-altivec --disable-armv5te --disable-armv6 --disable-vis --shlibdir=/usr/lib/x86_64-linux-gnu
libavutil 51. 9. 1 / 51. 9. 1
libavcodec 53. 7. 0 / 53. 7. 0
libavformat 53. 4. 0 / 53. 4. 0
libavdevice 53. 1. 1 / 53. 1. 1
libavfilter 2. 23. 0 / 2. 23. 0
libswscale 2. 0. 0 / 2. 0. 0
libpostproc 51. 2. 0 / 51. 2. 0
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'masques_3.mp4':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42isom
creation_time : 2011-03-12 23:44:00
encoder : mp4creator 1.6.1d
Duration: 00:04:30.51, start: 0.000000, bitrate: 826 kb/s
Stream #0.0(eng): Video: h264 (High), yuv420p, 640x480 [PAR 1:1 DAR 4:3], 698 kb/s, 30 fps, 30 tbr, 90k tbn, 60 tbc
Metadata:
creation_time : 2011-03-12 23:44:00
Stream #0.1(eng): Audio: aac, 44100 Hz, stereo, s16, 125 kb/s
Metadata:
creation_time : 2011-03-12 23:44:09
[buffer @ 0xd74380] w:640 h:480 pixfmt:yuv420p tb:1/1000000 sar:1/1 sws_param:
[libvpx @ 0xd563c0] v0.9.6
Output #0, webm, to 'masques_3.webm':
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42isom
creation_time : 2011-03-12 23:44:00
encoder : Lavf53.4.0
Stream #0.0(eng): Video: libvpx, yuv420p, 640x480 [PAR 1:1 DAR 4:3], q=2-31, 700 kb/s, 1k tbn, 30 tbc
Metadata:
creation_time : 2011-03-12 23:44:00
Stream #0.1(eng): Audio: libvorbis, 44100 Hz, stereo, s16, 96 kb/s
Metadata:
creation_time : 2011-03-12 23:44:09
Stream mapping:
Stream #0.0 -> #0.0
Stream #0.1 -> #0.1
Press [q] to stop, [?] for help
frame= 8100 fps= 28 q=0.0 Lsize= 30135kB time=00:04:30.00 bitrate= 914.3kbits/s
video:27017kB audio:2961kB global headers:4kB muxing overhead 0.508066%
La taille du fichier masques_3.webm obtenu est de 30857270 octets.
Si l'on ajoute l'option -speed 0 alors la taille finale du fichier masques_3.webm est de 27687442 soit 10% de gain.
:
L'option -speed 0 ne se traduit pas toujours par un gain de poids par rapport à une vidéo encodée sans cette option.
En revanche elle permet presque toujours un (petit) gain de poids par rapport au fichier orignal.
Puis on applique la commande mkclean (binaire installé par le package du même nom) pour améliorer la lecture en streaming:
mkclean --optimize --remux masques_3.webm masques_3tmp.webm
Progress 1/3: 100% The SegmentUID element at 323 is not part of profile 'webm', skipping Remuxing... Reclustering... Generating Cues from scratch Progress 2/3: 100% The MinCache element at -1 is not part of profile 'webm', skipping The TrackTimecodeScale element at -1 is not part of profile 'webm', skipping The MaxBlockAdditionID element at -1 is not part of profile 'webm', skipping The CodecDecodeAll element at -1 is not part of profile 'webm', skipping The MinCache element at -1 is not part of profile 'webm', skipping The TrackTimecodeScale element at -1 is not part of profile 'webm', skipping The MaxBlockAdditionID element at -1 is not part of profile 'webm', skipping The CodecDecodeAll element at -1 is not part of profile 'webm', skipping Progress 3/3: 100% Finished cleaning & optimizing "masques_31.webm"
Puis on renomme le fichier:
rm -f masques_3.webm && mv masques_3tmp.webm masques_3.webm
Enfin, il est même possible de réaliser un petit test de conformité du fichier Webm grâce à mkvalidator (binaire installé par le package du même nom):
mkvalidator masques_3.webm
mkvalidator 0.3.6: the file appears to be valid
file created with libebml2 v0.21.1 + libmatroska2 v0.22.1 / mkclean 0.8.6 ru from Lavf53.4.0
Table des matières
- Outils de conversion des formats vidéo et audio (ogg, ogv, mp4, webm, mp3, flv, etc...)
- Diffusion multimédia : flv, h264, mkv, mp3, mp4, ogg, ogv, webm... ?
- ffmpeg2theora : conversion de MP4 vers OGG (Theora & Vorbis)
- ffmpeg2theora : conversion de FLV vers OGG (Theora & Vorbis)
- FFmpeg : conversion de MP4 ou FLV vers Webm (VP8 & Vorbis)
- FFmpeg : conversion de AVI vers MP4 (mpeg4)
- Script d'encodage de MP4 et FLV vers le format Webm / VP8
- Webm : documentation et outils du codec VP8
- Convertir les fichiers audio MP3 en fichiers audio OGG
- Encodage vidéo : problèmes rencontrés
Commentaires














