« Frame Buffer » : différence entre les versions
mAucun résumé des modifications |
|||
| (3 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 2 : | Ligne 2 : | ||
Le principe est d'utiliser le RAM vidéo au travers d'un device <code>/dev/fb0</code> et suivants si plusieurs écrans. | Le principe est d'utiliser le RAM vidéo au travers d'un device <code>/dev/fb0</code> et suivants si plusieurs écrans. | ||
Dans le cas d'un écran [[Écran Adafruit 2.8 pouces TFT|LCD Adafruit 2,8<nowiki>''</nowiki>]] c'est en général <code>/dev/fb1</code>. | |||
== Introduction == | == Introduction == | ||
| Ligne 7 : | Ligne 9 : | ||
=== Exemple === | === Exemple === | ||
Pour commencer un exemple : Afficher des valeurs aléatoires.<syntaxhighlight lang="bash"> | Pour commencer un exemple : Afficher des valeurs aléatoires.<syntaxhighlight lang="bash"> | ||
cp /dev/random /dev/fb0 | cp /dev/random /dev/fb0 # Sur mon écran HDMI | ||
</syntaxhighlight>Affiche une page avec... du bruit. Oui comme la TV analogique d' | cp /dev/random /dev/fb1 # Sur mon écran Adafruit 2.8'' | ||
</syntaxhighlight>Affiche une page avec... du bruit. Oui comme la TV analogique d'autrefois. | |||
[[Fichier:Bruit.png|sans_cadre|703x703px]] | [[Fichier:Bruit.png|sans_cadre|703x703px]] | ||
| Ligne 25 : | Ligne 29 : | ||
accel true | accel true | ||
rgba 5/11,6/5,5/0,0/0 | rgba 5/11,6/5,5/0,0/0 | ||
endmode | |||
$ fbset -fb /dev/fb1 | |||
mode "320x240" | |||
geometry 320 240 320 240 32 | |||
timings 0 0 0 0 0 0 0 | |||
rgba 8/16,8/8,8/0,0/0 | |||
endmode | endmode | ||
</syntaxhighlight>Dans mon cas le on a: | </syntaxhighlight>Dans mon cas le on a: | ||
* 1920 pixels sur 1080 (c'est une TV "Full HD") | * '''Sur /dev/fb0 (par défaut)''' | ||
* La profondeur est de 16 bits | ** 1920 pixels sur 1080 (c'est une TV "Full HD") | ||
* L'accélérateur graphique est à "on" | ** La profondeur est de 16 bits | ||
* la | ** L'accélérateur graphique est à "on" | ||
** rgba signifie que les bits sont donnés dans l'ordre rouge puis vert puis bleu et enfin la transparence. | ** la description des 16 bits de couleur est donnée dans la dernière ligne : | ||
** le rouge est codé sur 5 bits (les 11 suivants restent pour le reste) | *** rgba signifie que les bits sont donnés dans l'ordre rouge puis vert puis bleu et enfin la transparence. | ||
** le vert est codé sur 6 bits (les 5 suivants restent) | *** le rouge est codé sur 5 bits (les 11 suivants restent pour le reste) | ||
** le bleu est codé sur 5 bits (il ne reste rien) | *** le vert est codé sur 6 bits (les 5 suivants restent) | ||
** la transparence est codée sur... 0 bits. | *** le bleu est codé sur 5 bits (il ne reste rien) | ||
*** la transparence est codée sur... 0 bits. | |||
Le format du pixel est dit : RGB565. | Le format du pixel est dit : RGB565. | ||
* Sur /dev/fb1 (le mini écran LCD) | |||
** 320 pixels sur 240 | |||
** Profondeur de 32 bits | |||
** Pas d'accélérateur graphique. | |||
** La description des 32 bits | |||
*** 8 bits par composantes et rien pour la transparence | |||
Le format est dit RGB8880 | |||
== Copie d'écran == | == Copie d'écran == | ||
Une des premières choses que l'on peut faire c'est copier l'écran dans un fichier.<syntaxhighlight lang="bash"> | Une des premières choses que l'on peut faire c'est copier l'écran dans un fichier.<syntaxhighlight lang="bash"> | ||
# | # Ecran HDMI | ||
dd if=/dev/fb0 of=capture.raw bs=4M iflag=fullblock status=progress | dd if=/dev/fb0 of=capture.raw bs=4M iflag=fullblock status=progress | ||
ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 1920x1080 -i capture.raw -f image2 -vcodec png capture.png | ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 1920x1080 -i capture.raw -f image2 -vcodec png capture.png | ||
</syntaxhighlight>[[Fichier:Snapshot.png|sans_cadre| | |||
# Mini Ecran LCD | |||
dd if=/dev/fb1 of=capture-lcd.raw bs=4M iflag=fullblock status=progress | |||
ffmpeg -f rawvideo -pixel_format bgr0 -video_size 320x240 -i capture-lcd.raw -frames:v 1 -pix_fmt rgb24 capture-lcd.png | |||
</syntaxhighlight>Exemple sur le mini écran. | |||
[[Fichier:Snapshot.png|sans_cadre|540x540px]] | |||
Ca me rappelle mon Commodore 64 en 24 bits toute de même! | |||
Pour connaitre les modes RGB que sait gérer ffmpeg:<syntaxhighlight lang="bash"> | |||
ffmpeg -pix_fmts | |||
</syntaxhighlight>Nous donne la liste:<syntaxhighlight lang="text"> | |||
Pixel formats: | |||
I.... = Supported Input format for conversion | |||
.O... = Supported Output format for conversion | |||
..H.. = Hardware accelerated format | |||
...P. = Paletted format | |||
....B = Bitstream format | |||
FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL BIT_DEPTHS | |||
----- | |||
IO... yuv420p 3 12 8-8-8 | |||
IO... yuyv422 3 16 8-8-8 | |||
IO... rgb24 3 24 8-8-8 | |||
IO... bgr24 3 24 8-8-8 | |||
IO... yuv422p 3 16 8-8-8 | |||
... | |||
</syntaxhighlight>Y'en a deux pages comme ça. | |||
Dernière version du 4 décembre 2025 à 23:20
Le mode frame buffer est un intermédiaire entre le mode texte (léger, rapide) et X Windows (riche mais moins performant).
Le principe est d'utiliser le RAM vidéo au travers d'un device /dev/fb0 et suivants si plusieurs écrans.
Dans le cas d'un écran LCD Adafruit 2,8'' c'est en général /dev/fb1.
Introduction
Exemple
Pour commencer un exemple : Afficher des valeurs aléatoires.
cp /dev/random /dev/fb0 # Sur mon écran HDMI
cp /dev/random /dev/fb1 # Sur mon écran Adafruit 2.8''
Affiche une page avec... du bruit. Oui comme la TV analogique d'autrefois.
Bon on a le concept maintenant allons plus loin.
Les caractéristiques de l'écran
Sur le Raspberry PI la résolution d'écran est le résultat d'une négociation entre l'écran et le PI (sauf si la résolution est fixée en dur).
La commande fbset nous donne plein d'informations.
$ fbset
mode "1920x1080"
geometry 1920 1080 1920 1080 16
timings 0 0 0 0 0 0 0
accel true
rgba 5/11,6/5,5/0,0/0
endmode
$ fbset -fb /dev/fb1
mode "320x240"
geometry 320 240 320 240 32
timings 0 0 0 0 0 0 0
rgba 8/16,8/8,8/0,0/0
endmode
Dans mon cas le on a:
- Sur /dev/fb0 (par défaut)
- 1920 pixels sur 1080 (c'est une TV "Full HD")
- La profondeur est de 16 bits
- L'accélérateur graphique est à "on"
- la description des 16 bits de couleur est donnée dans la dernière ligne :
- rgba signifie que les bits sont donnés dans l'ordre rouge puis vert puis bleu et enfin la transparence.
- le rouge est codé sur 5 bits (les 11 suivants restent pour le reste)
- le vert est codé sur 6 bits (les 5 suivants restent)
- le bleu est codé sur 5 bits (il ne reste rien)
- la transparence est codée sur... 0 bits.
Le format du pixel est dit : RGB565.
- Sur /dev/fb1 (le mini écran LCD)
- 320 pixels sur 240
- Profondeur de 32 bits
- Pas d'accélérateur graphique.
- La description des 32 bits
- 8 bits par composantes et rien pour la transparence
Le format est dit RGB8880
Copie d'écran
Une des premières choses que l'on peut faire c'est copier l'écran dans un fichier.
# Ecran HDMI
dd if=/dev/fb0 of=capture.raw bs=4M iflag=fullblock status=progress
ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 1920x1080 -i capture.raw -f image2 -vcodec png capture.png
# Mini Ecran LCD
dd if=/dev/fb1 of=capture-lcd.raw bs=4M iflag=fullblock status=progress
ffmpeg -f rawvideo -pixel_format bgr0 -video_size 320x240 -i capture-lcd.raw -frames:v 1 -pix_fmt rgb24 capture-lcd.png
Exemple sur le mini écran.
Ca me rappelle mon Commodore 64 en 24 bits toute de même!
Pour connaitre les modes RGB que sait gérer ffmpeg:
ffmpeg -pix_fmts
Nous donne la liste:
Pixel formats:
I.... = Supported Input format for conversion
.O... = Supported Output format for conversion
..H.. = Hardware accelerated format
...P. = Paletted format
....B = Bitstream format
FLAGS NAME NB_COMPONENTS BITS_PER_PIXEL BIT_DEPTHS
-----
IO... yuv420p 3 12 8-8-8
IO... yuyv422 3 16 8-8-8
IO... rgb24 3 24 8-8-8
IO... bgr24 3 24 8-8-8
IO... yuv422p 3 16 8-8-8
...
Y'en a deux pages comme ça.
