mplayer n'est pas le seul lecteur vidéo sur la planète libre, mais c'est clairement le plus robuste et souvent le plus rapide. Ce véritable couteau suisse de l'encodage/décodage répond présent même dans les cas critiques de vidéos endommagées ou mal encodées. Maintenant mplayer étant un outil très complexes, je vais surtout m'attacher ici à décrire mon utilisation courante de cet indispensable outil.
MPlayer, principes de base
Décodeurs audio et vidéo
mplayer est un lecteur et seulement un lecteur. Il ne fait pas comme VLC de diffusion mais comme VLC, se base sur des psoeudo URL pour déterminer le type de source. La plus basique est l'URL "locale" de type file:///mom_dossier/ma_vidéo.avi, qui peut se contracter en /mon_dossier/ma_vidéo.avi.
gaston$mplayer /mon_dossier/ma_video.aviLecture d'un vidéo locale
Déjà comme cela, mplayer devrait correctement lire votre vidéo. Il est cependant possible qu'il soit nécessaire de régler plus finement le type de sortie audio ou vidéo à utiliser, ce qui correspond respectivement aux paramètres -ao et -vo. La liste des modules de décodage disponibles pour chacun des deux cas est accessible en tapant simplement mplayer -ao help ou mplayer -vo help. Ainsi, sur mon U810, il est clairement plus efficace de lire la vidéo avec le greffon -vo gl (utilisant OpenGL, comme compiz) qu'avec -vo xv activé par défaut. Du coup, si je veux lire ma vidéo en forçant la sortie GL et l'audio ALSA, nous obtenons la commande suivante :
gaston$mplayer -vo gl -al alsa /mon_dossier/ma_video.aviLecture d'une vidéo en utilisant OpenGL et ALSA
Sous-titres
Enfin l'ajout de sous-titres au format texte (ex. fichier .srt) est possible sur n'importe quelle vidéo, soit automatique si le fichier a exactement le même nom que le fichier avi, soit en spécifiant le chemin et le nom du fichier des sous-titres par l'option -sub.
gaston$mplayer -sub en_anglais.srt /mon_dossier/ma_video.avilecture d'un AVI avec les sous-titres
Forçage du type de conteneur
Normalement mplayer détecte tout seul le format du conteneur passé en paramètre. Il arrive cependant que le fichier soit mal gaulé et que cette détection se révèle hasardeuse. Dans ce cas il est possible de forcer un type de conteneur, ou plus exactement le module chargé de décoder le conteneur. Par exemple lavf pour le format DV. Comme toujours pour ce type d'argument indiquant un module, il est possible d'en obtenir la liste via mplayer -demuxer help :
gaston$mplayer -demuxer lavf mauvais_fichier.dvforce la lecture d'un fichier DV avec lavf
Navigation au clavier
A partir du moment où la vidéo est en route, le déplacement se fait par les flèches gauche/droite, haut/bas pour de plus grands déplacements, et page up et page down pour d'encore plus grands bonds. Le volume se change par les touches * et /, le passage d'une piste à l'autre par < et > et la bascule en plein écran par f. La pause se fait par la touche espace et vous pouvez à tout moment quitter mplayer par la touche q.
L'activation/désactivation des sous-titres se fait par la touche v, F pour forcer leur affichage, et le passage d'une langue à l'autre par y et g.
Enfin si vous notez une désynchronisation entre l'audio et la vidéo, il est toujours possible d'ajuster cela avec les touches + et -.
Extraction de piste
Il est possible d'utiliser mplayer pour extraire la piste audio ou vidéo d'une source arbitraire :
# extraction de la piste audio/MP3 d'un AVIgaston$mplayer -dumpaudio -dumpfile audio.mp3 source.avi# extraction de la piste vidéo d'un AVIgaston$mplayer -dumpvideo -dumpfile vidéo.mpeg source.mpegextraction de piste
Dans un cas comme dans l'autre, le format d'origine est strictement conservé. Mais il est possible d'extraire des versions "brutes", c'est à dire décodées :
# extraction d'une piste audio au format WAV/PCMgaston$mplayer -vc dummy -vo null -ao pcm source.avi# extraction d'une piste vidéo au format PPMgaston$mplayer -vc dummy -ao null -vo pnm source.aviextraction de piste décodée
Lecture d'un média
Les sources de données lisibles par mplayer ne se limitent pas, loin de là, aux seuls conteneurs locaux.
Lecture par liste
S'agissant des listes de lecture, vous devez passer la référence du fichier en paramètre avec l'option -playlist
# une simple playlist au format WinAMPgaston$mplayer -playlist ma_playlist.m3u# une playlist via le réseau, ici la liste de la FreeBox TVgaston$mplayer -playlist http://mafreebox.freebox.fr/freeboxtv/playlist.m3u
Lecture d'un DVD
En utilisant le système d'URL de mplayer, il est bien entendu possible d'attaquer directement un lecteur de DVD :
gaston$mplayer dvd://lecture d'un DVD
Tel quel, la lecture se fera à partir du plus long titre, qui est généralement celui du film lui-même. Il est cependant possible de sélectionner un titre particulier en ajoutant son numéro après le //
gaston$mplayer dvd://2lecture d'un DVD à partir du titre 2
Il est aussi possible de sélectionner la langue par ordre de priorité avec -alang fr,en (d'abord le français, puis l'anglais), ainsi que les sous-titres avec -slang en,fr.
Pour connaître la structure d'un dvd , il est possible d'utiliser la commande lsdvd :
gaston$lsdvd -asDisc Title: WATERWORLDTitle: 01, Length: 02:09:38.140 Chapters: 17, Cells: 18, Audio streams: 05, Subpictures: 10Audio: 1, Language: en - English, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 5, AP: 0, Content: Undefined, Stream id: 0x80Audio: 2, Language: de - Deutsch, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 2, AP: 0, Content: Undefined, Stream id: 0x81...Audio: 5, Language: es - Espanol, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 2, AP: 0, Content: Undefined, Stream id: 0x84Subtitle: 01, Language: en - English, Content: Undefined, Stream id: 0x20,Subtitle: 02, Language: pt - Portugues, Content: Undefined, Stream id: 0x21,...Subtitle: 10, Language: fr - Francais, Content: Undefined, Stream id: 0x29,Title: 02, Length: 00:01:55.000 Chapters: 02, Cells: 02, Audio streams: 01, Subpictures: 00Audio: 1, Language: en - English, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 2, AP: 0, Content: Undefined, Stream id: 0x80Title: 03, Length: 00:00:24.000 Chapters: 02, Cells: 02, Audio streams: 01, Subpictures: 00Audio: 1, Language: en - English, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 6, AP: 0, Content: Undefined, Stream id: 0x80Longest track: 01structure d'un dvd
Dans certain cas il peut être pratique si l'on a plus d'un lecteur de DVD, de spécifier en plus le périphérique à utiliser pour la lecture avec l'option -dvd-device /dev/sr0. Cette option permet aussi de lire un dossier issu de la recopie d'un DVD en local (via vobcopy -m).
# le DVD doit être monté pour être copiégaston$sudo mount /dev/cdrom /media/cdromgaston$vobcopy -mVobcopy 1.1.0 - GPL Copyright (c) 2001 - 2007 robos@muon.de[Info] Writing files to this dir: /vidéo/WATERWORLD/VIDEO_TS/...gaston$lsdvd -as /vidéo/WATERWORLD...Longest track: 01gaston$mplayer -dvd-device /vidéo/WATERWORLD dvd://1capture et lecture d'un DVD
L'utilisation de lsdvd est juste là pour montrer comment utiliser cette commande avec un dossier, sinon l'utilisation de mplayer avec dvd:// aurait très bien suffit. En tout cas voilà un moyen simple pour lire un DVD sans le bruit assourdissant du lecteur. Notez que cette approche fait sauter la protection technique du DVD (région et chiffrement), et qu'elle est donc absolument illégale.
Dans certains cas vous pouvez vous retrouver (je ne veux pas savoir comment) avec des sous-titres au format idx et sub, voir ifo. Il s'agit d'une extraction brute du flux correspondant dans un .VOB. Comme pour les srt vus plus haut, si ces fichiers ont le même nom que le fichier AVI, tout est automatique. Sinon il faut tout de même que les deux fichiers aient le même nom et tenter la commande suivant :
gaston$mplayer -vobsub nom_sub_sans_extention fichier.avilecture de sous-titres VOB
Comme pour un DVD, les .sub peuvent contenir plusieurs langues et l'option -slang est donc applicable.
Lecture d'un flux réseau
Avec les flux provenant du réseau et la notion de protocole qui leur est associée, la URL prennent tout leur sens. Voici quelques exemples de flux réseau que mplayer est capable de prendre en charge :
# Lecture d'un flux mmsgaston$mplayer mms://source/fichier.wmv# lecture d'un flux RTSP en UDPgaston$mplayer udp://239.255.0.11:1234# Lecture des programmes de France2 sur la FreeBox, notez les "" pour éviter une mauvaise interprétationgaston$mplayer "rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=201&flavour=sd"# Lecture de la radio "France Culture" à partir des flux de la FreeBox. Notez le "-novideo" car ici, seule la piste audio MP2 est disponible.gaston$mplayer -novideo "rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=100006"Lecture de flux
Enfin, il est possible de sauvegarder ces flux en conservant le format original. Par exemple pour sauvegarder une chaîne de la FreeBox :
# notez les "", sans eux cela ne marchera pas...gaston$mplayer -dumpstream -dumpfile resultat.ts "rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=201&flavour=sd"sauvegarde d'un flux FreeBox TV
Le fichier résultat est donc, dans cet exemple, très exactement au même format que celui émi par les services free, à savoir du MPEG2 pour la vidéo, du MP2 pour l'audio, un flux texte pour le télétexte, le tout encapsulé en MPEG_TS.
Lecture d'une carte Radio
Une carte Radio FM simple, ou une carte TV analogique incluant un tuner FM (ex. Leadtek TV2000) est utilisable directement par mplayer :
# Lecture de la radio à la fréquence 105.5 (France Intox)gaston$mplayer radio://105.5# Lecture de la radio en passant par une listegaston$mplayer -radio channels="105.5-France Info,102.3-OUI FM" radio://2lecture de la radio
Lecture d'une périphérique V4L
V4L pour Vidéo For Linux, est infrastructure de capture vidéo sous la forme de modules Kernel qu'utilisent les pilotes de WebCAM, de cartes TV analogique (ex. Leadtek TV2000) et/ou d'acquisition vidéo. Lorsque tout ce petit monde est correctement chargé, cela débouche sur la création d'une entrée de type /dev/videoX (ex. /dev/video0) qui permet aux applications de communiquer avec le matériel en utilisant les librairies V4L.
Une carte d'acquisition analogique, à partir d'un signal TV, Composite ou SVidéo, utilise donc le module V4L (ou V4L version 2, alias v4l2). Il est résulte pour mplayer une ligne un peu barbare qui va permettre de spécifier, à travers les options du pilote v4l ou v4l2, la manière dont le flux doit être décodé :
gaston$mplayer -tv driver=v4l2:device=/dev/video1:volume=100:input=0:normid=9:outfmt=nv12:decimation=1:channels="25-TF1,22-France2,28-France3,K06-Canal+,30-France5/Arte,33-M6" tv://5Lecture d'une chaine de télévision analogique
Les points intéressant sont l'utilisation de -tv pour passer mplayer en mode télévision et ainsi indiquer l'utilisation du v4l2, suivi de ses paramètres. Et enfin la sélection du canal initial avec l'URL de type tv://.
Dans les options du pilote, nous avons passé, comme pour la lecture radio, un jeu de fréquences. Il suffit donc de presser la touche K pour changer de canal. Dans le paramétrage du pilote, le source "tuner" correspond au paramètre input=0. Du coup, si nous cherchons cette fois à numériser une vidéo, nous utiliserons 1 pour sélectionner l'entrée composite et 2 pour l'entrée S-Vidéo. Ainsi pour lire une cassette VHS en passant par un magnétoscope, cela nous donne :
gaston$mplayer -tv driver=v4l2:device=/dev/video1:volume=100:input=2:normid=9:outfmt=nv12:decimation=1 tv://Lecture de la numérisation de l'entrée S-Vidéo
Comme la carte TV analogique, un WEBCam utilise elle aussi le module V4L. La lecture se fait de la même manière que précédemment avec des options un peu différentes, typiquement la résolution désirée :
# Lecture d'un flux provenant d'une WEBCAMgaston$mplayer -tv driver=v4l:width=320:height=240:device=/dev/video1 tv://lecture d'une WebCAM
Maintenant la lecture directe des flux V4L va devenir surtout intéressante lorsqu'utilisée avec mencoder (voir section suivante) pour sauvegarder cela dans des conteneurs type AVI.
Lecture de la TNT
La TNT est un flux DVB (Digital Video Broadcast) provenant d'une carte de réception "qui va bien", dans mon cas une Nova-T. Contrairement aux cartes analogiques, les cartes TNT fournissent directement le flux vidéo émis, sans numérisation, et demande donc aucune ressource processeur pour procéder à un enregistrement en temps réel. La lecture et son utilisation va donc un peu ressemble à ce que nous avions pour un flux réseau.
Outre le fait d'arriver à faire fonctionner la carte, ce qui ne pose plus trop de problème aujourd'hui, tout le jeu est de générer la liste chaîne/fréquences qui permettra d'utiliser mplayer aussi simplement que cela :
gaston$mplayer dvb://ARTELecture d'un flux DVB (via une carte TNT)
Cette liste de fréquence est obtenue grâce à l'utilitaire scandvb (ou scan ou dvbscan) du paquet dvb-apps. Son rôle va être de prendre en entrée une liste de transpondeurs, pour chacun d'eux, opérer un balayage des fréquences et de détecter les chaînes qu'ils hébergent. Cette liste initiale composée pour la France de 6 fréquences est spécifique à votre région. Vous pouvez la récupérer ici. Pour ce faire vous devez d'abord repérer le nom du fichier (ex. fr-paris) et lancer les commandes suivantes :
gaston$cvs co http://www.linuxtv.org/cgi-bin/viewcvs.cgi/dvb-apps/util/scan/dvb-t/fr-parisgaston$dvbscan fr-paris > ~/.mplayer/channels.confrécupération de la liste parisienne et balayage des fréquences
Ceci fait, vous obtenez un fichier .mplayer/channels.conf composé d'une série de lignes comme celle-ci :
ARTE:586167000:INVERSION_AUTO:BANDWIDTH_8_MHZ:FEC_3_4:FEC_NONE:QAM_64:TRANSMISSION_MODE_8K:GUARD_INTERVAL_1_8:HIERARCHY_NONE:520:530:261
il est conseillé de modifier ce fichier pour ôter tout espace sur les noms de la première colonne (ex. Canal_Plus). Ensuite, vu que les cartes TNT ne font que réceptionner et vous transmettre un flux pré-existant, il ne reste plus qu'à utiliser mplayer comme pour les flux réseaux (-dumpstream) de sorte à récupérer un conteneur MPEG_TS/MP2/MPEG2 d'une résolution "DVD" que ni M6, ni TF1, ne peuvent vous empêcher de sauvegarder:
gaston$mplayer -dumpstream -dumpfile temps_de_cerveau_utile.ts dvb://ARTEgaston$mplayer -dumpstream -dumpfile temps_de_cerveau_inutile.ts dvb://TF1sauvegarde d'un flux DVB
Lecture d'un caméscope DV
mplayer ne contient aucun module capable de lire à partir d'un caméscope DV, il sait en revanche très bien lire ce format. L'astuce est donc de passer par la commande spécialisée dvgrab :
# chargement du module firewire si ce n'est déjà faitgaston$sudo modprobe raw1394# lecture du flux DV via le fireWire en demandant à dvgrab de vider dans la sortie standardgaston$dvgrab - | mplayerLecture de la vidéo d'un camescope DV
Bien sur mplayer ne permettra pas de se déplacer dans la vidéo. Pour y arriver il faut récupérer localement la vidéo
# vidage d'un blocgaston$dvgrab --format raw ma_video.dvgaston$mplayer ma_video.dv# vidage par séquencesgaston$dvgrab --timestamp --autosplit -format raw ma_video.dvVidage de la vidéo d'un camescope DV
Pour désentrelacer la vidéo, vous pouvez soit faire cela au moment du transcodage avec mencoder (voir plus loin), soit dés maintenant avec ffmpeg, sans perte :
gaston$ffmpeg -i video-source.dv -deinterlace -target dv video-desentrelacee.dvDésentrelacement d'une vidéo DV
Encodage
Petit topo sur le groupe MPEG
Pour la petite histoire, la majorité des formats que nous allons utiliser sont issus du Moving Picture Experts Group, alias MPEG, un groupe d'experts qui oeuvre depuis une vingtaine d'années à la définition de normes internationales de compression/décompression audio et vidéo. De ce groupe, à la fois immanence de l'ISO, du CEI et d'entreprises privées, naquirent 6 normes : MPEG-1, MPEG-2, MPEG-4, MPEG-7, MPEG-21 et MPEG-A. Les plus connues sont les trois premières, composées chacune de plusieurs parties numérotées et dédiées à l'audio, la vidéo, le sous-titrage, etc. Chaque partie est elle-même éventuellement composée de niveaux (ou layers ou profiles) spécifiant une technique d'encodage particulière.
Ainsi la norme MPEG-1, conçue en 1988 pour le stockage sur CD-ROM, est surtout connue pour le Niveau 3 de sa Partie 3 (Audio), le célèbrissime MP3. Elle est aussi connue pour le niveau 2 de cette même partie (MP2), un format audio que beaucoup considèrent comme aussi bon que l'AC3.
La norme MPEG-2 de 1994 qui cible les DVD et la télévision numérique (DVB/TNT) est connue pour sa partie 7, le codage audio AAC successeur du MP3 et adopté par Apple autant pour sa qualité que pour sa capacité à intégrer ces maudits DRM. Le projet libre chargé de l'encodage de l'AAC est faac.
La partie 2 de la norme est quant à elle dédiée au codage vidéo normalisé sous le doux nom de h.262 et généralement appelé mpeg2. Enfin la partie 1 définit le conteneur de flux MPEG_TS (Transport Stream). Ces trois parties forment ce que l'on trouve dans n'importe quel DVD vidéo actuel avec en plus l'utilisation du codage audio AC3 issue des laboratoires Dolby Digital (qui n'a donc rien à voir avec MPEG).
Pour des raisons de timing, la norme MPEG-3 (rien à voir avec MP3) n'a jamais vu le jour, laissant la place à MPEG-4 qui date quant à elle de 1998 et s'attaque à la notion de flux audio/vidéo à travers un réseau. Elle est connue pour sa partie 14 définissant un nouveau conteneur à peu prés aussi évolué qu'un matroska, mais surtout pour sa partie 2, une nouvelle norme compression des signaux vidéo démocratisée par le fameux DivX. Ce codec, jusqu'à sa version 3.11 (1999), n'était qu'un gros hack réalisé par Jérôme Rota (et oui, un frenchy ;-) du codec ASF, implémentantation Microsoftienne du MPEG-4 part 2. Ce n'est qu'à sa version 4 qu'il fut (ré)écrit devenant ainsi une implémentation aussi autonome que propriétaire. C'est pour cette raison qu'est née le projet libre xVid, ou encore l'encodeur/décodeur de la librairie libavcodec du projet FFMPEG. A noter que libavcodec prend en charge un bien d'autres formats.
Mais avec l'arrivée de la vidéo HD, c'est la partie 10 de la norme MPEG-4 qui a pris son envol. Plus connue sous le nom d'AVC (Advanced Video Codec) ou H.264, ce format permet d'améliorer le rendu tout en conservant, et même augmentant, le gain de place. La contrepartie de cet exploit étant une sollicitation bien plus intensive du CPU tant pour l'encodage que le décodage. Une implémentation libre de ce format existe avec le projet x264, libavcodec ne sachant que le décoder.
A noter que ces normes ne sont pas tombés du chapeau mais correspondent généralement à des techniques crées par des sociétés expertes sur les sujets traités, ce qui n'est pas sans impact sur leur utilisation. En effet, et contrairement à pas mal d'idée reçues, le fait qu'un format soit normé ne signifie par pour autant qu'il soit libre. Le MP3 en est un célèbre exemple et son utilisation de quelque manière que ce soit est soumise à redevance. En France, ces "royalties" sont à verser selon le type d'utilisation à Philips, TFS, France Télécom, IRT, Fraunhaifer IIS et Thomson. Ainsi ce n'est pas parce que l'implémentation d'un compresseur comme mp3 lame est libre, que son utilisation l'est, contrairement par exemple à OGG/Vorbis de la fondation xiph.
Dans le même ordre idée que pour l'audio, ce n'est pas parce que xvid ou x264 sont libres qu'il en va de même de leur utilisation. Là aussi xiph propose un codec vidéo aussi performant que MPEG-4 Part.. 2, qui lui est libre, le format Theora, qui n'est autre qu'une évolution du codec CP3 de la société On2 Technologies qui en a cédé les droits. Ce format est donc totalement libre tant pour un usage commercial que privé.
Moteurs d'encodage
mencoder peut être vu comme un mplayer dont la visualisation a été remplacée par un système d'encodage. Cette architecture implique que tout ce que nous venons de voir avec mplayer est directement exploitable avec mencoder.
L'encodage à proprement parlé est pris en charge par des modules autonomes disposant chacun de leurs options et prenant en charge un ou plusieurs encodages. Le choix du moteur d'encodage se fait distinctement pour l'audio avec l'option -oac encodeur ou la vidéo par l'option -ovc encodeur. Ensuite chaque encodeur a ses options propres que l'on passe par un paramètre variable d'un moteur à l'autre. La liste des encodeurs vidéo est disponible par mplayer -ovc help et pour l'audio c'est mplayer -oac help.
Voici une série de moteurs les plus utilisés, les formats pris en charge et les paramètres à indiquer pour les mettre en oeuvre :
| moteur | Formats pris en charge | paramètre pour les options |
|---|---|---|
| mp3 lame | MPEG-1 P3 L3 (MP3) | -oac mp3lame -lameopts preset=192 |
| lavc | MPEG-1 P3 L2 (MP2) | -oac lavc -lavcopts acodec=mp2:abitrate=224 ... |
| faac | MPEG-2 P7 (AAC) | -oac faac -ffacopts br=192 |
| lavc | AC3 | -oac lavc -lavcopts acodec=ac3:abitrate=192 ... |
| lavc | MPEG-2 P2 (h.262) | -ovc lavc -lavcopts vcodec=mpeg2video:vrc_maxrate=9800:vbitrate=5000 |
| lavc | MPEG-4 P2 (h.262) | -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500 |
| xvid | MPEG-4 P2 | -ovc xvid -xvidencopts bitrate=800 |
| x264 | MPEG-4 P10 (h.264) | -ovc x264 -x264encopts bitrate=2048 |
| lavc | Codage sans perte | -ovc lavc -lavcopts vcodec=ffc1 |
| lavc | Vorbis Audio | -oac lavc -lavcopts acodec=vorbis |
Si vous utilisez lavc pour l'audio ET la vidéo, vous pouvez gagner en clarté en spécifiant deux fois l'option -lavcopts. Pour des informations plus pointues sur ces options, il faut se reporter à man mencoder.
Mise en oeuvre
Comme vous le voyez, la palette est assez complète pour transcoder à peu prés tout en n'importe quoi. Ainsi la compression d'une DVD vers un conteneur AVI contenant un flux h264 à 2048kb/s (max) pour la vidéo et AC3 à 192 kb/s pour l'audio se fait de la manière suivante :
gaston$mencoder -alang en -oac faac -faacopts br=192 -ovc x264 -x264encopts bitrate=800:threads=4 -o film_vo.avi dvd://compression d'un DVD en h264/AC3
L'utilisation de l'option thread=4 permet d'exploiter les processeurs multi-core. Malheureusement si cela fonctionne à merveille avec x264, l'option semble plus ou moins ignorée avec les autres moteurs.
Il est aussi possible de conserver un des flux en le recopiant sans transcodage dans le conteneur cible en utilisant le module copy
# création d'un AVI en transcodant l'audio en MP3 mais en conservant la vidéo en mpeg2gaston$mencoder -oac mp3lame -lameopts preset=192 -ovc copy -o resultat.avi dvd://# création d'un AVI en transcodant la video mpeg4 mais en conservant l'audio d'originegaston$mencoder -oac copy -ovc lavc -lavcopts vbitrape=800 -o resultat.avi source.aviEncodage du son ou de la vidéo seulement
De la même manière il est possible de transcoder les flux que nous avons vu plus haut :
# encodage d'un flux provenant d'une WEBCAM utilisant v4l en mpeg4gaston$mencoder -tv driver=v4l:width=320:height=240:device=/dev/video1 -ovc lavc -lavcopts vcodec=mpeg4 -o resultat.avi tv://# encodage d'un flux TNT en mpeg4gaston$mencoder -oac mp3lame -lameopts preset=192 -ovc lavc -lavcopts vcodec=mpeg4 -o resultat.avi dvb://ARTELecture et sauvegarde d'un flux WEBCAM
Pour terminer, mencoder est capable de prendre en charge une série de fichiers sources qu'il suffit de mettre les uns à la suite des autres, ou alors de vider dans un tube :
# encodage d'une série de fichiergaston$mencoder -oac mp3lame -lameopts preset=192 -ovc lavc -lavcopts vcodec=mpeg4 -o resultat.avi fichier1.dv fichier2.dv fichier3.dv# encodage par un tubegaston$cat fichier1.dv fichier2.dv fichier3.dv | mencoder -oac mp3lame -lameopts preset=192 -ovc lavc -lavcopts vcodec=mpeg4 -o resultat.aviencodage et agrégation de rushes
Cette caractéristique peut être utilisé comme une méthode de sauvage pour fusionner des AVI :
gaston$mencoder -noidx -ovc copy -oac copy -o film_complet.avi fichier_1.avi fichier_2.avi fichier_3.avifusionner plusieurs fichiers AVI
Les sous-titres
Le fait que mencoder encode la sortie de mplayer nous permet une opération intéressante : l'incrustation des sous-titres. Pour un DVD, ainsi en forçant leur affichage (-slang fr) ces derniers vont être automatiquement intégrés dans le fichier AVI final.
gaston$mencoder -alang en -slang fr -oac faac -faacopts br=192 -ovc x264 -x264encopts bitrate=800:threads=4 -o film_vo.avi dvd://compression d'un DVD en h264/AC3 avec sous-titres
Sur un DVD les sous-titres sont de simples flux vidéos et pas des données textes, l'intégration se fait donc sans problème par mencoder. Pour les AVI fournis avec des sous-titres au format texte comme .srt, il faut fournit à mencoder la police qui sera utilisée pour l'incrustation. Cela se fait par un simple lien symbolique à partir d'une police existante, ici Bitstream Vera Sans :
gaston$ln -s /usr/share/fonts/TTF/Vera.ttf ~/.mplayer/subfont.ttfConfiguration de la police mplayer/mencoder
Ceci fait, il faut rajouter un paramètre à la ligne de commande d'encodage pour spécifier le facteur d'agrandissement de cette police. Ce qui nous donne pour un encodage avec sous-titres d'un AVI existant en conservant le canal audio mais en ré-encodant (obligé !) le canal vidéo :
gaston$mencoder -sub sous-titres.srt -subfont-text-scale 3 -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=800 -o file-avec-sous-titres.avi source.aviEncodage d'un AVI vers un AVI avec sous-titres incrustés
Le cas Theora
Aucun outil n'est parfait et mencoder n'échappe pas à la règle et son point faible principal réside de sa non prise en charge très moyenne du projet VORBIS. Mencoder ne sait donc pas générer un conteneur vorbis, mais plus embêtant, ne sait pas encoder une vidéo au format Theora. La solution pour encoder dans ce format est donc de passer par ffmpeg2theora. Il est malgré tout possible de bénéficier des capacités de lectures, incrustations de sous-titre et autres effets audio ou vidéo de mencoder en passant par la technique suivante :
gaston$mencoder -alang en -slang fr -oac lavc -lavcopts acodec=vorbis -ovc lavc -lavcopts vcodec=ffv1 -o temp.ffv1 dvd://gaston$ffmpeg2theora temp.ffv1 -o resultat.ogggaston$rm -rf temp.ffv1Encodage au format theora
Comme vous le voyez, mencoder sait tout de même générer du son au format vorbis, pour la vidéo, l'astuce à consisté à utiliser le format "raw" de libavcodec. Ce format n'applique aucune compression et génère donc un fichier aussi gros que la source, mais contenant tous les effets appliqués. Du coup c'est une opération qui prend de la place mais qui est assez rapide. Il suffit ensuite de passer ce fichier à ffmpeg2theora pour générer un conteneur vorbis avec le son et vidéo 100% libre. Côté qualité, une appréciation toute subjectif de ma part, je ne vois pas bien la différence avec du mpeg-4 part 2. Maintenant je suis clairement moins regardant qu'écoutant.
Changer de conteneur
Par défaut, mencoder multiplexe les flux audio et vidéo dans un conteneur de type AVI. Il est cependant possible de fabriquer d'autres types de conteneurs avec le paramètre -of (La liste est disponible via mencoder -of help). Par exemple pour fabriquer un conteneur MPEG/TS
gaston$mencoder \-of mpeg -mpegopts format=dvd:tsaf \-oac lavc -ovc lavc -lavcopts vcodec=mpeg2video:vrc_buf_size=1835:vrc_maxrate=9800:vbitrate=5000:\keyint=15:vstrict=0:acodec=ac3:abitrate=192 \-o cible.mpeg \source.aviencodage vers un conteneur MPEG
Utilisation des filtres
mencoder autorise la mise en place une chaîne de filtres (paramètre -vf effet1,effet2,etc...) permettant d'opérer un certain nombre de transformations sur l'image avant l'encodage. Par exemple pour re-dimensionner la vidéo pour une plus petite résolution.
gaston$mencoder -o cible.avi -oac mp3lame -lameopts preset=192 -ovc xvid -xvidencopts bitrate=800 -vf scale=320:160 source.avicropping et scalling
Dans la série des filtres pratiques, nous avons aussi crop, capable de virer les bandes noires. Mais autant il est simple de savoir ce que l'on désire obtenir comme résolution de sortie, autant c'est un peu plus compliqué d'obtenir les bonnes informations pour découper les bandes noires d'une vidéo. L'astuce est alors d'utiliser encore mplayer pour analyser le fichier source et ainsi nous indiquer les bons paramètres pour crop. Lorsque les valeurs sont stables, pressez q :
# repérage des bandes noiresgaston$mplayer source.avi -vf cropdetect...[CROP] Crop area: X: 2..700 Y: 92..502 (-vf crop=720:432:0:72)....q# Utilisation du greffon CROPgaston$mencoder -o cible.avi -oac mp3lame -lameopts preset=192 -ovc xvid -xvidencopts bitrate=800 vop scale=320:160,crop=720:432:0:72 source.aviSuppression des bandes noires
Pour ceux qui comme moi utilisent un caméscope fournissant des images au format DV entrelacé, il est possible d'utiliser le filtre pp=fd qui va supprimer l'effet "peigne" :
gaston$dvgrav - | mencoder -demuxer lavf -oac mp3lame -lameopts preset=192 -ovc lavc -lavcopts vcodec=mpeg4 -vf pp=fd -o resultat.aviencodage du flux DV via firewire avec dés-entrelacement
L'option demuxer permet, comme nous l'avons vu plus haut, de forcer la lecture du fichier DV avec le lecteur de conteneur lav, ce qui est utile lorsqu'une vidéo a mal été sauvegardée lors du transfert.
Passer en revue tous les effets serait un peu longuet, citons-en juste un dernier, expand (ex. expand=0:-50:0:0), qui permet d'ajouter une bande noire dans toutes les directions, très utile pour faire de la place à d'éventuels sous titres. De manière générale vous pouvez obtenir la liste des greffons d'effets vidéo par un mencoder -vf help et l'aide sur le paramétrage d'un greffon particulier peut être obtenu par un mencoder -vf greffon=help.
Enfin les filtres ne se limitent pas à la vidéo, il y en a aussi un bon paquet dédiés à la modification de la bande son comme par exemple -af volume=20:1 qui permet d'obtenir un gain en décibel (ici 20dB). Là aussi la liste des greffons peut être obtenue par mencoder -af help et l'aide sur un greffon par mencoder -af grefon=help.
Encodage en plusieurs passes
Il est aussi possible de faire avec mencoder de l'encodage en deux passes pour un rendu optimum :
# on vire les anciens logs s'ils existentgaston$rm frameno.avi *.log# première passe d'encodage, aucun fichier vidéo n'est créé (/dev/null), juste les logsgaston$mencoder -oac mp3lame -lameopts preset=96 -aid 128 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500:vpass=1 -o /dev/null dvd://# deuxième passe, le fichier est créé en utilisant les logs de la première passe pour optimiser le rendugaston$mencoder -oac mp3lame -lameopts preset=96 -aid 128 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=500:vpass=1 -o résultat.avi dvd://encodage en deux passes
Maintenant pour être honnête, je ne fais deux passes que pour les fichiers que je cherche à minimiser en taille et/ou en résolution.
Trucs et astuces
Réparation des indexes
Si le conteneur, typiquement un AVI, est mal indexée, ce qui arrive par exemple lorsque l'on cherche à lire un fichier en cours de téléchargement, il suffit de rajouter l'option -idx pour que mplayer reconstruise l'index avant la lecture. Il sera alors possible de se déplacer dans la vidéo.
L'option -idx peut aussi être utilisée avec kbd>mencoder. Notez l'utilisation de copy pour l'audio ET la vidéo impliquant l'absence de transcodage :
gaston$mencoder -idx fichier_corrompu.avi -ovc copy -oac copy -o fichier_réparé.aviréparer l'index d'un fichier AVI
Extraction de d'une portion de vidéo
L'objectif est ici de découper une vidéo en deux, à partir d'une position temporelle donnée. La vidéo source n'est pas obligatoirement un AVI.
# -endpos définit la fin de notre première partiegaston$mencoder -endpos 1:00:00 -oac copy -ovc copy -o début.avi film.avi# -ss définit le début de notre seconde partiegaston$mencoder -ss 1:00:00 -oac copy -ovc copy -o fin.avi film.avidécoupage d'un fichier vidéo
Notez que -endpos définit une durée et pas une position. Il est ainsi possible d'extraire une portion entre deux positions temporelles en combinant -endpos et -ss pour un même appel à mencoder.
gaston$mencoder -ss 1:00:00 -endpos 0:30:00 -oac copy -ovc copy -o portion.avi film.aviextraction d'une portion vidéo
Conclusion
Finalement le seul domaine qui rend encore indispensable un autre très bon outil qu'est VLC est la diffusion. Ceci mis à part, il est possible de faire à peu prés n'importe quoi avec mplayer/mencoder.
Vos remarques et commentaires...
Article très intéressant sur un lecteur formidable.
J'ai également écrit un tuto qui complète plus ou moins le tien à cette adresse :
http://bluecosmos.tuxfamily.org/blog/2008/12/mplayer-tutorial/
Comme d'habitude, article d'excellente qualité ! Moi qui n'aime pas mettre mon nez dans la doc technique pure, je suis toujours ravi avec tes articles !
Hop, bookmarké !
Merci et bonne année ! ;)
Salut et bonne année.
Superbe article (comme d'habitude) sur LE lecteur de linux. Là , personnellement cela m'interresse plus que les réseaux (d'ailleurs je me casse les dents sur le mien (que j'essaie de me monter). On voit que tu as regardé des vidéos (entre cet article et celui d'audacity) pendant les vacances.!!!!
@teto:article aussi interressant, je ne savais pas qu'ils faisaient une version 2 reecrite en +
@uhlume: La version pdf ne fonctionne pas,Pour écrire cet article, tu as decortiqué les 136 pages de man le + long que je connaisse. Moi, je n'y vais que ponctuellement. Bravo. Tu peux utiliser tcprobe pour les infos à la place de lsdvd.Aurais-tu des infos pour les cartes dvb, là ça m'interresse assez. Après vlc et mplayer,Vivement que tu t'attaques au couteau suisse de la video sous linux :Transcode.J'ai hate de lire l'article car il y a autant à écrire que sur mplayer.
Tchao et encore bonne année.
@teto je vais te repiquer deux trois trucs ;-)
@cenwen tu aurais besoin de quelles infos sur la TNT ?
@teto :Tu dis que mplayer est optimisé pour la ...playstation2 , peux-tu developper, je ne comprends pas.
@Ulhume :Grosso modo tout ce que tu as.
Mplayer permet d'acquerir à partir d'une carte dvb-a l'analogique. Peut-il acquérir la tnt c'est-à-dire à partir d'une dvb-t et à quel format (containeur mpeg2-hd et/ou mpeg4-avc)? Par v4l ? Si oui comment? Si c'est possible cela est très interressant car transcode et ffmpeg et mjpegtools le permetrons aussi.
Comment fait-tu pour obtenir les chaines en analogique et en numeriques? Peut-on se faire une liste de programmes ?
Comment parametrer mplayer avec cette liste , peut-on avoir ou mettre un epg ?
Comme tu peux le voir j'ai beaucoup de questions (posées et à posées)et je suis interressé par tout ce que tu peux me donner.
A +
Je n'ai, juste que là, jamais pu correctement manipuler mes enregistrements TNT car dès que je voulais découper les pubs par exemple avec avidemux en recopiant les flux il y avait toujours un décalage audio-vidéo su le fichier de sortie.
Ne connaissant que peu mplayer que j'utilise juste parce que sur un vieux pc il est super légé, j'ai appris grâce à ce tuto que l'on pouvait refaire l'index ce qui pourrai peut être résoudre mon problème.
Je n'ai pas encore trop le temps de voir ça pour l'instant, de plus chez mes parents je n'ais pas la TNT, mai bientot je testerais.
Merci pour ces tuto clair et prècis que je lis régulièrement.
@cenwen j'ai mis à jour le tuto en y mettant tout ce que j'avais mis en note sur la TNT (je ne l'utilise plus maintenant, because FreeBox), radio et cartes d'acquisition analogique.
@Nithir Pour la TNT, j'ai résolu le problème du décalage avec ProjectX
Sinon BRAVO pour ce très bon résumé des commandes de mplayer et mencoder.
Ceci dit, je n'utilise plus mplayer directement depuis longtemps, et lui préfère la version avec interface : smplayer
@Nithir: il faut decaler le son d'entree de -125 millisecondes (par contre je ne sais + où je l'ai lu et en +recement).
Projectx est très bien , il y a aussi gopchop, dvbcut et ttcut (le site est en allemand mais le logiciel est en anglais)
@Ulhume: Je viens de voir (merci) mais tu as modifié pas mal de choses, c'est tres bien car cela evolue et dans le bon sens.
Ahrg!! Je vais devoir tout reimprimer. (Hum, du temps que j'y pense le pdf n'est tjrs pas telechargable).
La qualité de ton article (et aussi celui de teto dans une autre mesure) meriterai de figurer en tres bonne place sur Lprod et ....dans la documentation de ubuntu (eh oui ubunteros avant tout et malgré tout).Je vais avoir du mal à resister.
@cenwen attends un peu avant d'imprimer, je n'ai pas répondu à ta remontée d'anomalie mais je suis en train de bidouiller le moteur de pdf pour corriger cela.
Dans la documentation d'Ubuntu ??? Mais quel affront ;-))))))
Blague mise à part ne te gène pas, c'est fait pour cela. Laisse juste un rétro lien car j'ai dans l'idée qu'il va encore bouger ce papier.
@cenwen la version PDF devrait être OK maintenant
Je confirme , il est déjà imprimé et disequé.Merci
De meme que je confirme que cet article (et celui de teto) figure sur lprod et sur la documentation d'ubuntu-fr (cela a été rélativement facile pour lprod un peu moins sur ubuntu, mais bon pour une 1ere fois).Il serait bien de le proposer à linxpedia http://www.linuxpedia.fr/doku.php mais je ne sais pas comment faire et je crois surtout que c'est à toi de faire la démarche (ou du moins que tu fournisses ton accord.)
J'ai adoré le passage où tu explique la difference entre v4l (analogique) et dvb-t (numerique) ce qui ma permis de comprendre la difference. En fait, le dvb c'est du streaming!!!!!
Si ton application ici mplayer/mencoder/ffmpeg peut recevoir du streaming, il peut visualiser voir enregistrer la dvb-t. Pour ces 3 là, c'est sur. A voir pour transcode et les mjpegtools, mais je ne pense pas qu'il y a de problèmes. En fait il faut juste essayer d'acquerir le flux d'une carte par ces applications.
v4l2 a été developpé comme une evolution de v4l mais n'a jamais été jugé comme suffisament stable pour prendre la suite de v4l (ce qui fait que ces 2 API coexiste. v4l3 est annoncé commme leur succeceur à tous les 2 qu'en penses-tu ?
Je connais les 3 1eres normes mpeg, qu'en est-il des mpeg-7, mpeg-21 et mpeg-a.?
Je pense que sur le dvix tu as du faire une erreur.Jerome rota a effectivement developpé le divx3 à partir d'un hack du codec de micro@++ et que devant la complexité de la tache, il a fait appel à la communauté libre pour la version 3 et 4 .Ce n'est qu'à la version 5 qu'il changa la license. C'est pourquoi, à partir des sources de la version 4 que le projet xvid est né (et est superieur à la version 5 ; la version 1.21 est sortie ces jours ci)
En tout cas merci de ta reactivité, ta gentillesse et de nous faire partager ton savoir.
Juste pour info, il exite une GUI de mplayer (parmis tant d'autres) pour ecouter et regarder les webtv et qui est francaise : pyqtradio http://www.lck-world.info/pyqtradio/index.php .Elle est assez interressante pour etre connue.
Tchao @+
Ouai bof, j'suis pas trop d'accord, je trouve Xine bien plus stable et
bien mieux codé. En matière de stabilité, VLC n'est pas mal non plus.
Perso, j'utilise les trois, en fonction du média à lire. J'ai remarqué
qu'Mplayer avais souvent des problèmes de synchonisation son/vidéo avec
les médias mal encodés ou trop compressés, Xine & VLC eux ne rencontrent
pas ce type de problème.
Pas d'accord sur quoi ? Sur le "plus robuste et plus rapide" ? Robuste veut dire qu'il fonctionne dans toutes les situations, même sur des fichiers corrompus, ce que VLC a du mal à faire. Rapide s'entend dans le sens "rapide à mettre en oeuvre". Là aussi VLC en ligne de commande n'est pas un sinécure.
Pour ce qui est de Xine, j'avoue mal le connaître. Et pour les problèmes de synchro ma foi, je n'ai juste jamais eu de problèmes.
Enfin "mencoder" est pour moi partie intégrante de mplayer, et là, Xine n'encode pas me semble t-il et VLC, ben, on revient à la complexité de sa ligne de commande.
Bonjour,
Ce tuto me sert tout le temps, je chrechais récemment à daire du streaming avec mplyaer/mencoder et j'ai trouvé ceci : http://www.benjaminbaudouin.com/streaming-video-avec-netcat-et-mencoder/ qui me semble fonctionnel (je testerais dasn la semaine).
Bon Week-end
Excellent, un streaming à base de mcat, j'adore !!! :)
Publier un nouveau commentaire