Erreur de segmentation avec ClutterGst

ClutterGst.init(argv) fait tout planter

a marqué ce sujet comme résolu.

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 :)

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).

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.

+1 -0

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>

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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