Bonjour à tous,

Je rencontre un problème déconcertant avec un script Python qui utilise VLC pour afficher des images PNG et JPG sur un Raspberry Pi. Le script télécharge des images depuis un serveur S3 et les affiche en boucle. Cependant, les couleurs ne s'affichent pas correctement : ce qui devrait être rouge apparaît comme bleu foncé et vice versa. Curieusement, les vidéos MP4 sont affichées avec les couleurs correctes, ce qui suggère que le problème est spécifique aux images statiques.

Voici ce que j'ai observé :

Sur mon PC, les images s'affichent avec les bonnes couleurs.
Sur le Raspberry Pi, utilisant VLC pour la visualisation, les images affichent les couleurs incorrectes (rouge affiché comme bleu foncé, et bleu affiché comme rouge,...).
L'inversion de couleurs ne semble pas être corrigée par des manipulations d'image standard, comme l'inversion des canaux rouge et bleu via un script Python utilisant PIL/Pillow.
Le script fonctionne en bouclant sur un répertoire de médias téléchargés et en les ajoutant à une playlist VLC, qui est ensuite jouée en boucle. J'ai essayé d'inverser les canaux de couleur immédiatement après le téléchargement des images, mais cela n'a pas résolu le problème. J'ai également ajouté des logs pour confirmer que le script modifie bien les images, mais l'affichage des couleurs reste incorrect sur le Raspberry Pi.

J'utilise un Raspberry Pi 3B+3, avec la version Raspberry Pi OS Legacy 32Bit Lite.

Voici un extrait simplifié du script qui montre le processus de téléchargement et de traitement des images :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import vlc
 
LOCAL_DIR = os.getenv("LOCAL_DIR", "/home/displex/content")  # Default local directory
 
def fetch_local_file_list(directory):
    try:
        # Extend to fetch jpg and png files as well
        return [f for f in os.listdir(directory) if f.lower().endswith(('.mp4', '.jpg', '.png'))]
    except Exception as e:
        return []
 
def update_play_list(media_list, instance, media_files):
    media_list.lock()
    while media_list.count() > 0:
        media_list.remove_index(0)
 
    for media_file in media_files:
        media_path = os.path.join(LOCAL_DIR, media_file)
        if media_file.lower().endswith(('.jpg', '.png')):
 
            media = instance.media_new(media_path)
 
        else:
            media = instance.media_new(media_path)
        media_list.add_media(media)
    media_list.unlock()
 
class VideoHandler(FileSystemEventHandler):
    def __init__(self, media_list, instance):
        self.media_list = media_list
        self.instance = instance
 
    def on_created(self, event):
        if event.src_path.endswith((".mp4", ".jpg", ".png")):
            update_play_list(self.media_list, self.instance, fetch_local_file_list(LOCAL_DIR))
 
    def on_deleted(self, event):
        if event.src_path.endswith((".mp4", ".jpg", ".png")):
            update_play_list(self.media_list, self.instance, fetch_local_file_list(LOCAL_DIR))
 
def play_videos():
    instance = vlc.Instance('--no-xlib --aout=alsa --quiet --file-logging --logfile=vlc-log.txt --no-video-title-show --verbose=2')
    media_list = instance.media_list_new()
 
    player = instance.media_list_player_new()
    player.set_media_list(media_list)
    player.set_playback_mode(vlc.PlaybackMode.loop)
 
    media_files = fetch_local_file_list(LOCAL_DIR)
    update_play_list(media_list, instance, media_files)
 
    observer = Observer()
    event_handler = VideoHandler(media_list, instance)
    observer.schedule(event_handler, LOCAL_DIR, recursive=False)
    observer.start()
 
    player.play()  # Start playback