~rom1v/blog { un blog libre }

Lire des images et des vidéos sans serveur X (dans un TTY)

Saviez-vous qu’il était possible de lire des images et des vidéos dans un TTY, sans serveur X ? Je ne parle pas de les afficher en ASCII-art, mais bien de les afficher “graphiquement” :

bbb-tty

Je ne le savais pas jusqu’à aujourd’hui. En fait, c’est possible grâce à des programmes qui écrivent directement dans le framebuffer.

Pour tester les outils suivants, lancez un TTY grâce aux raccourcis Ctrl+Alt+F[1-6]. Pour revenir à votre session graphique, faites Ctrl+Alt+F7 (sur certaines distributions, par défaut la session graphique est plutôt accessible avec Ctrl+Alt+F1, Ctrl+Alt+F8 ou Ctrl+Alt+F9, essayez…).

Images

Pour afficher des images, il faut installer le paquet fbi (framebuffer imageviewer) :

sudo apt-get install fbi

Puis simplement exécuter :

fbi monimage.jpg

ou même

fbi *.jpg

(PgUp et PgDown permettent de naviguer entre les images)

Cet outil est vraiment très rapide (sauf pour le zoom). C’est un peu l’équivalent de feh qui, lui, fonctionne en mode graphique.

Vidéos

Pour les vidéos, nous avons besoin de MPlayer :

sudo apt-get install mplayer

En lançant dans un TTY :

mplayer mavidéo.avi

MPlayer choisit le pilote fbdev. Nous pouvons aussi le choisir explicitement :

mplayer -vo fbdev mavidéo.avi

Par contre, la vidéo s’affiche à sa taille originale, alors que nous la voulons en plein écran. Il faut donc la mettre à l’échelle, grâce aux paramètres de mplayer. Sur un écran 1680×1050 par exemple :

mplayer -fs -vf scale=1680:-3 mavidéo.avi

-3 permet de calculer la seconde composante à partir de la première et de l’aspect-ratio. C’est dans le man :

 0: largeur/hauteur dimmensionnées à d_width/d_height
-1: largeur/hauteur originales
-2: Calcule l/h en utilisant l'autre dimension et le rapport hauteur/largeur
    redimensionné.
-3: Calcule l/h en utilisant l'autre dimension et le rapport hauteur/largeur
    original.
-(n+8): Comme -n ci-dessus, mais en arrondissant les dimensions au plus
        proche multiple de 16.

Sur mon pc portable, j’arrive sans problème à lire dans un TTY une vidéo 1080p (j’ai testé avec Big Buck Bunny en MP4, redimensionnée lors de la lecture à la taille de mon écran, 1680×1050).

Par contre, sur une machine moins puissante (une EeeBox, qui hébergeait ce blog par le passé), MPlayer saccade, même sur des vidéos basse définition, que VLC lit sans problèmes. Pour améliorer les performances de lecture de MPlayer, il est possible de changer l’algorithme de zoom logiciel, grâce à l’option -sws. Par exemple, pour utiliser bilinéaire rapide au lieu de bicubique :

mplayer -fs -vf scale=1680:-3 -sws 0 mavidéo.avi

Avec ce paramètre, ça ne saccade plus.

Cependant, sur la EeeBox, dans ce cas les couleurs sont incorrectes apparemment à cause d’un bug de pilote vidéo Intel. J’ai donc quand même installé un serveur X avec un gestionnaire de fenêtres minimaliste, awesome. Mais c’est une autre histoire…

ASCII-art

Je vous parlais d’ASCII-art au début du billet, il est également possible de lire les images ou les vidéos en ASCII (c’est juste moins joli), grâce à des commandes d’une élégance toute particulière.

Pour les images, nous pouvons installer le paquet caca-utils

sudo apt-get install caca-utils

Puis utiliser cacaview :

cacaview monimage.jpg

Pour les vidéos :

mplayer -vo caca mavidéo.avi

bbb-ascii

Conclusion

Je n’en revenais pas qu’il soit possible de lire des vidéos sans serveur X. Sur une machine destinée à une utilisation multimédia (branchée sur la TV par exemple), il n’y a donc nullement besoin d’un serveur X (paradoxalement).

Commentaires

erdnaxeli

Héhé, que de bons outils. Il y a aussi links qui a une option de compilation pour afficher les images avec le frame buffer.

J’ai passé quelques mois avec un système sans X il fut un temps, et ça se fait à peu près bien.

2beta

Pour les vidéo VLC le fait aussi très bien, (jamais tester sans X mais dans ubuntu ça tourne). http://osxdaily.com/2009/11/07/watch-movies-in-ascii-art-with-vlc/

®om

@2beta

Tu parles uniquement de l’ASCII-art, pas de la lecture graphique de la vidéo… J’ai rajouté une capture d’écran qui montre le résultat (quand on n’active pas le plein écran).

Cependant, avec cvlc, ce devrait être possible, mais j’ai testé sur ma EeeBox ça fige au bout d’une seconde…

Pamadeo

Ça c’est cool ! :o sans compter que dans les transports, pour économiser encore un peu de batterie ça doit bien aider si on veut regarder un film :) Merci pour l’astuce !

Je n’en revenais pas qu’il soit possible de lire des vidéos sans serveur X.

Pourtant tu le rencontrais probablement tous les jours. ;)

C’est ce qui est utilisé notamment dans certaines distributions pour afficher un logo au démarrage (usplash), avant que X ne soit lancé. Je crois également savoir que le framebuffer est utilisé dans les distributions n’utilisant pas de serveur X (comme les Linux embarqués ou ceux des téléphones portables) pour pouvoir afficher des applications graphiques (avec l’inconvénient principal de ne pas pouvoir gérer les fenêtres comme sous X).

dacrovinunghi

Ben ouai c’est le framebuffer que l’on voit sur les live cd ou les distro de rescue par exemple.

http://fr.wikipedia.org/wiki/Framebuffer_Linux

®om

@gnuzer :

Effectivement, je m’étais déjà demandé comment étaient affichés ces logos, et j’imaginais bien qu’il y avait quelque chose pour afficher les pixels un à un… Mais de là à afficher une vidéo 1080p à 25 fps… ;-)

Sined

Ouahhh, alors là je suis completement bluffé !!! Y a pas a dire, mais je trouve ca vraiment tres fort !

Une question comme ca, connaitriez vous par hasard une appli qui pourrait faire des captures d’écran de page web sans serveur X ?

erdnaxeli

@Shined : j’utilise wkhtmltopdf, mais ça nécessite un programme pour simuler un serveur X qui est souvent mal packagé et implique d’installer tout un serveur X :/

®om

@erdnaxeli :

Je viens d’essayer wkhtmltopdf (ainsi que webkit2pdf), mais il ne semble pas prendre en compte la CSS (j’ai testé sur blog.rom1v.com, dans un serveur X).

SX1

Bonsoir,

Excellente astuce, mais un détail m’échappe :

Mes vidéos son sur un serveur headless, donc sans X. Je ne peut accéder à ce serveur qu’en SSH (ou NFS, mais là n’est pas le sujet).

Doit-on lancer un tty à partir de l’invite de commande dans la session ouverte en SSH ?

Car en fait je n’arrive pas à lancer un tty sur ce serveur, j’ai comme retour #tty: opérande supplémentaire

et ce que je fasse #tty 3 mplayer mavideo.avi ou #tty mplayer mavideo.avi j’ai le même retour, je suis bloqué.

mplayer et lui bien installé et si je le lance direct depuis la session ssh j’ai un retour me disant lancament imposisble car pas de X (là c’est logique, je comprend).

Merci d’avance.

®om

@SX1 :

Si ton serveur est distant, qu’il ait un serveur X ou non n’a pas d’importance.

La vidéo devra de toute façon être décodée localement, ce n’est pas le serveur qui va la décoder pour te l’envoyer, sinon il faudrait un débit monstrueux inutilement. Par exemple, une vidéo 720×576 à 25fps nécessiterait 720×576×24×25 ≃ 249Mbps.

Ce qu’il faut dans ce cas, c’est accéder au fichier de la vidéo pour le lire localement. Si le débit entre ta machine et ton serveur te permet la lecture “en temps réel”, il faut simplement lire le fichier distant (avec ou sans X, c’est indépendant).

Par exemple, sur SSH, tu peux utiliser sshfs :

sshfs serveur:/mon/repertoire/distant /mon/repertoire/local

et lire le fichier à partir de /mon/repertoire/local.

[…] on peut afficher des images dans son terminal (TTY), sans serveur X, je savais pas […]

Sined

@erdnaxeli :

Pour faire des captures d’écran avec X, j’ai trouvé une super appli : gnome-web-photo

Par contre, sans X je n’ai encore rien trouvé…

En tout cas, merci. :o)

alz

C’est meugnon ça de redécouvrir les anciennes techniques, quand les jeux et les démos affichaient leur graphismes sans serveur graphique X ou Windows ni drivers de carte graphique, quand on écrivait directement en mémoire xD

Baronsed

J’ai suivi la doc ubuntu-fr (10.04) mais pas moyen…

®om

@Baronsed :

Tu as lu quoi sur la doc ubuntu-fr, et tu n’as pas réussi à faire quoi ?

Et quels ont été les problèmes rencontrés ?

Baronsed

Un fofo est plus adapté, en fait.

http://forum.ubuntu-fr.org/viewtopic.php?pid=8768891#p8768891

Je te donnerai un retour, si je parviens à résoudre ce problème ;-)

Bien content d’avoir pu t’aider. En plus, t’as choisi Awesome. :D

Sur mon PC, pour revenir à l’interface graphique, c’est pas avec f7, f1 ou f9… mais avec f5. :p

Hybrid Son Of Oxayotl

Note :

mplayer -fs -vf scale=1680:-3 mavidéo.avi

Je n’arrivais pas à adapter cette ligne pour la faire marcher chez moi, avant de réaliser que le problème venait du fait qu’en raison du ratio respectif de mon écran et de la vidéo, l’image finale dépassait la résolution de mon écran. Conclusion : pour certaines vidéos, je dois utiliser

mplayer -fs -vf scale=1280:-3 mavidéo.avi

et pour d’autres

mplayer -fs -vf scale=-3:800 mavidéo.avi

Oui c’est rigolo!

C’est un pas de + vers le tout console. A quand firefox/iceweasel sans X? (mais avec graphisme quand même…)

C’est vrai que cette astuce date un peu, mais elle est toujours d’actualité …

Ralala … je me souviens d’une époque ou ma machine était tellement peu puissante que le -vo fbdev était mon seul moyen de regarder un film sans que cela ne saccade (sous X en -vo xv ou -vo gl, ça ramait …).

L’époque de mon Céléron 400 overclocké en résumé … (/me vieux)

Logik

SAlut ®om

je me connecte à mon serveur en ssh avec putty . Et j’ai ce message d’erreur:

using "DejaVu Sans Mono-16", pixelsize=16.67
file=/usr/share/fonts/truetype/ttf-dejavu/DejaVuSansMono.ttf

ioctl VT_GETSTATE: Invalid argument (not a linux console?)

Y a t’il une solution pour ce problème ?

Alex

Bonjour

Merci pour cette astuce.

J’ai une question, si mon PC linux sans serveur X est branché en HDMI à ma TV.

Est-il possible de lancer de la même manière une video qui sortira via le port HDMI sans serveur X, le tout depuis une connection remote SSH ( je sais pas si c’est clair..je n’utilise pas Linux) ???

Merci beaucoup de ton aide

®om

@Alex :

Je ne sais pas si c’est possible, ça.

Alex

j’ai trouvé ca :

http://www.linuxquestions.org/questions/linux-software-2/video-playback-without-x-327906/

il faut rediriger la sortie de mplayer vers la sortie de la cg.

a tester..

Les commentaires sont fermés.