Artisan Numérique

/système/vidéo/mplayer/ Guide pratique pour mplayer

Mplayer n'est pas le seul lecteur audio/vidéo sur la planète libre, mais c'est de loin le lecteur en ligne de commande qui cumule le plus d'avantages à mes yeux. Il est rapide, lit tout ou presque sans jamais râler, s'adapte à toutes les situations matérielles et tout cela avec des options en ligne de commande qui ne demande pas un doctorat en araméen pour être utilisées (cf. VLC).

Dans ce tuto nous allons voir comment utiliser Mplayer dans divers cas d'usage comme la lecture de DVD, de webcam ou encore d'une emission TNT.

Pour débuter...

mplayer est un lecteur et seulement un lecteur. Il ne fait pas comme VLC de diffusion mais comme VLC, se base sur de pseudos 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.

gastonmplayer /mon_dossier/ma_video.avi
Lecture 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 dans 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) 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 :

gastonmplayer -vo gl -al alsa /mon_dossier/ma_video.avi
Lecture d'une vidéo en utilisant OpenGL et ALSA

Réparation des indexes

Si la vidéo a mal été encodé, ou si comme moi vous êtes une vraie feignasse qui n'attends jamais qu'une vidéo soit entièrement téléchargée pour la lire (je parle de la vidéo du dernier repas de famille évidemment !), mplayer dispose d'une option bien pratique de reconstruction de l'indexe des fichiers AVI. Pour l'activer, il suffit simplement d'ajouter -idx à mplayer. Ceci fait, vous pourrez vous déplacer normalement dans la vidéo.

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.

gastonmplayer -sub en_anglais.srt /mon_dossier/ma_video.avi
lecture 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 :

gastonmplayer -demuxer lavf mauvais_fichier.dv
force la lecture d'un fichier DV avec lavf

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 quant à lui 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 -.

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 WinAMP
gastonmplayer -playlist ma_playlist.m3u

une playlist via le réseau, ici la liste de la FreeBox TV
gastonmplayer -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 :

gastonmplayer dvd://
lecture d'un DVD

La navigation dans un DVD est normalement possible mais n'a jamais réussi à fonctionner chez moi. Elle se fait en remplaçant dvd:// par dvdnav//.

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

gastonmplayer dvd://2
lecture 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 :

gastonlsdvd -as
Disc Title: WATERWORLD
Title: 01, Length: 02:09:38.140 Chapters: 17, Cells: 18, Audio streams: 05, Subpictures: 10
Audio: 1, Language: en - English, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 5, AP: 0, Content: Undefined, Stream id: 0x80
Audio: 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: 0x84
Subtitle: 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: 00
Audio: 1, Language: en - English, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 2, AP: 0, Content: Undefined, Stream id: 0x80

Title: 03, Length: 00:00:24.000 Chapters: 02, Cells: 02, Audio streams: 01, Subpictures: 00
Audio: 1, Language: en - English, Format: ac3, Frequency: 48000, Quantization: drc, Channels: 6, AP: 0, Content: Undefined, Stream id: 0x80

Longest track: 01
structure 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é
gastonsudo mount /dev/cdrom /media/cdrom
gastonvobcopy -m
Vobcopy 1.1.0 - GPL Copyright (c) 2001 - 2007 robos@muon.de
[Info] Writing files to this dir: /vidéo/WATERWORLD/VIDEO_TS/
...
gastonlsdvd -as /vidéo/WATERWORLD
...
Longest track: 01
gastonmplayer -dvd-device /vidéo/WATERWORLD dvd://1
capture 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.

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 :

gastonmplayer -vobsub nom_sub_sans_extention fichier.avi
lecture 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 mms
gastonmplayer mms://source/fichier.wmv

lecture d'un flux RTSP en UDP
gastonmplayer udp://239.255.0.11:1234

Lecture des programmes de France2 sur la FreeBox, notez les "" pour éviter une mauvaise interprétation
gastonmplayer "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.
gastonmplayer -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...
gastonmplayer -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. ma vieille Leadtek TV2000) est utilisable directement par mplayer :

Lecture de la radio à la fréquence 105.5 (France Intox)
gastonmplayer radio://105.5

Lecture de la radio en passant par une liste
gastonmplayer -radio channels="105.5-France Info,102.3-OUI FM" radio://2
lecture 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é :

gastonmplayer -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://5
Lecture 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 :

gastonmplayer -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 WEBCAM
gastonmplayer -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 :

gastonmplayer dvb://ARTE
Lecture 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 :

gastoncvs co http://www.linuxtv.org/cgi-bin/viewcvs.cgi/dvb-apps/util/scan/dvb-t/fr-paris
gastondvbscan fr-paris > ~/.mplayer/channels.conf
ré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:

gastonmplayer -dumpstream -dumpfile temps_de_cerveau_utile.ts dvb://ARTE
gastonmplayer -dumpstream -dumpfile temps_de_cerveau_inutile.ts dvb://TF1
sauvegarde d'un flux DVB

Pour générer un conteneur AVI/MP3/MPeg4, voir l'exemple donné plus loin dans la section encodage.

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à fait
gastonsudo modprobe raw1394

lecture du flux DV via le fireWire en demandant à dvgrab de vider dans la sortie standard
gastondvgrab - | mplayer
Lecture 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 bloc
gastondvgrab --format raw ma_video.dv
gastonmplayer ma_video.dv

vidage par séquences
gastondvgrab  --timestamp --autosplit  -format raw ma_video.dv
Vidage 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 :

gastonffmpeg -i video-source.dv -deinterlace -target dv video-desentrelacee.dv
Désentrelacement d'une vidéo DV

Conclusion

Mplayer mérite bien, je pense, sa réputation de lecteur tout terrain. Comme je le disais en introduction, ce n'est pas le seul et VLC lui aussi est très efficace à ce jeu là. Mais là où Mplayer brille, c'est dans sa simplicité d'usage en ligne de commande qui en fait un outil absolument indispensable.