Erreur de segmentation avec ClutterGst

ClutterGst.init(argv) fait tout planter

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir les zesteux,

Je suis en train de suivre le tuto suivant : https://vimeo.com/26452876 qui explique comment utiliser Clutter pour faire le lien entre Gstreamer et Gtk en Python grâce PyGobject (tant de noms barbares en une phrase…).

Bref, le tuto est peu vieux, du coup lorsqu'il indique qu'il faut taper ClutterGst.init(0, "") Python indique qu'il ne faut qu'un argument, et d'après la doc, il s'agit (logiquement) de sys.argv. Sauf que ce changement, loin de résoudre mon problème, provoque une "Erreur de segmentation (core dumped)", chose que je ne sais absolument pas gérer. Est-ce que quelqu'un a déjà eu ce problème avec ClutterGst ?

Le code incriminé :

 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
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('Clutter', '1.0')
gi.require_version('GtkClutter', '1.0')
gi.require_version('ClutterGst', '3.0')

from gi.repository import Gtk, Clutter, GtkClutter, ClutterGst
import os, sys
UI_FILE = "video-player.ui"

class VideoPlayer:
    def __init__ (self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file(UI_FILE)
        self.builder.connect_signals(self)
        
        self.progress = self.builder.get_object('progress')
        self.button = self.builder.get_object('button')
        
        
        self.window = self.builder.get_object('window')
        self.window.show_all()
        
    def destroy(self, window):
        Gtk.main_quit()
        
def main(argv):
    GtkClutter.init(argv)
    ClutterGst.init(argv) #si je commente cette ligne, plus de bug, mais plus de ClutterGst non plus :(
    app = VideoPlayer()
    Gtk.main()

if __name__ == '__main__':
    main(sys.argv)

Merci d'avance pour votre aide :)

Étudiant à l'HEAJ de Namur. Envie de découvrir Sass ? Voilà, voilà…

+0 -0

Hello,

Quand j'execute ton code je n'ai pas de segfault, mais juste un warning au moment de gi.require_version('ClutterGst', '3.0'): ValueError: Namespace ClutterGst not available for version 3.0 (il charge la version 2 apparement).

Evidement comme je n'ai pas ton fichier video-player.ui, j'ai une erreur au moment de self.builder.add_from_file(UI_FILE).

Testé avec Python 2.7 et python-gi 3.14.0-1 sur Debian 8 (jessie).

http://nodraak.fr/ – Dictateur bienveillant de l'iTeam, logiciel libre et sécurité à l'ECE Paris

+0 -0
Auteur du sujet

En remplaçant la ligne 5 par : gi.require_version('ClutterGst', '2.0'), ça ne provoque pas le bug ? Parce que chez moi, peu importe la version chargée, j'ai le même problème. De même, aucune différence entre Python 2.7 et 3.4. C'est vrai que j'ai oublié de préciser que je tourne sous Fedora, ce qui a peut-être son importance.

Étudiant à l'HEAJ de Namur. Envie de découvrir Sass ? Voilà, voilà…

+0 -0

Je ne vois pas de segfault dans le paste que tu nous donnes, mais une erreur GLib.Error: g-file-error-quark: Failed to open file 'video-player.ui': No such file or directory (4). Il faut que tu vérifies que ton fichier video-player.ui est bien dans le même dossier que ton script Python, ou adapter le chemin en conséquence.

Edit: navré, j'ai regardé la mauvaise réponse.

Regarde du côté de ce post sur les forums de GNOME, <https://mail.gnome.org/archives/clutter-list/2015-March/msg00004.html>, qui préconise de charger ClutterGstavant ClutterGst. Bien que ça ne concerne pas directement Python, il se peut qu'il s'agisse d'un bug analogue.

Édité par dab

+1 -0
Auteur du sujet

C'était malheureusement trop beau… Si je mets ClutterGst.init avant GtkClutter.init, plus de Segfault effectivement, mais j'obtiens une fenêtre noire et qui ne répond pas (pas moyen de déclencher le signal 'destroy', il faut tuer le processus…) : Clutter, pourquoi tant de haine ?

Je suis tombé sur le code suivant sur Internet, qui n'utilise pas Builder :

 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
import sys, gi
gi.require_version("Gtk", "3.0")
gi.require_version("ClutterGst", "3.0")
gi.require_version("GtkClutter", "1.0")
 
from gi.repository import Gtk, ClutterGst, GtkClutter, Clutter
 
class ClPlayer(Gtk.Window):
 
    def __init__(self):
        Gtk.Window.__init__(self)
        # new
        self.actor = Clutter.Actor.new()
        self.content = ClutterGst.Aspectratio.new()
        self.player = ClutterGst.Playback.new()
        # set
        self.content.set_player(self.player)
        self.actor.set_content(self.content)
        self.actor.show()
        # size
        self.actor.set_width(1024)
        self.actor.set_height(436)
        # add
        self.embed = GtkClutter.Embed()
        self.stage = self.embed.get_stage()
        self.stage.add_child(self.actor)
        self.add(self.embed)
        # play
        self.player.set_uri("file:///home/mathis/Téléchargements/sintel-1024-surround.mp4")
        self.player.set_playing(True)
        # show
        self.resize(1024, 436)
        self.show_all()
 
 
    def do_delete_event(self, event):
        Gtk.main_quit()
 
#Clutter.init(sys.argv) # Error
GtkClutter.init(sys.argv)
ClutterGst.init(sys.argv)
 
win = ClPlayer()
Gtk.main()

Et il marche sans problème (la lecture se lance sans soucis, les signaux ne sont pas bloqués, bref). Par contre si on inverse (ClutterGst.init avant Gtk.Clutter.init), on obtient une fenêtre noire (mais Gstreamer semble quand même tourner, vu que le son passe). D'où ma question, est-ce que cela pourrait être une incompatibilité entre Clutter et Gtk.Builder ?

Au cas où, mon fichier .ui :

 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
60
61
62
63
64
65
66
67
68
69
70
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.19.0 -->
<interface>
  <requires lib="gtk+" version="3.16"/>
  <object class="GtkAdjustment" id="adjustment1">
    <property name="upper">100</property>
    <property name="step_increment">1</property>
    <property name="page_increment">10</property>
  </object>
  <object class="GtkWindow" id="window">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Video player</property>
    <property name="resizable">False</property>
    <property name="window_position">center</property>
    <property name="icon_name">applications-multimedia</property>
    <signal name="destroy" handler="destroy" swapped="no"/>
    <child>
      <object class="GtkBox" id="box">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <placeholder/>
        </child>
        <child>
          <object class="GtkBox" id="box1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkButton" id="button">
                <property name="label">gtk-open</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkScale" id="progress">
                <property name="visible">True</property>
                <property name="sensitive">False</property>
                <property name="can_focus">True</property>
                <property name="opacity">0.96999999999999997</property>
                <property name="adjustment">adjustment1</property>
                <property name="show_fill_level">True</property>
                <property name="round_digits">1</property>
                <property name="draw_value">False</property>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

Édité par Matouche

Étudiant à l'HEAJ de Namur. Envie de découvrir Sass ? Voilà, voilà…

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte