web-dev-qa-db-fra.com

L'objet 'module' n'a pas d'attribut 'element_make_factory'

j'ai ce code:

import pygst 
import st, pygtk
player_name = gst.element_make_factory("playbin", "Multimedia Player")
player_name.set_property("uri", "../media/alert.mp3")
player_name.set_state(gst.PLAYING)

il continue de me lancer l'erreur suivante:

 player_name = gst.element_make_factory("playbin", "Multimedia Player")
 AttributeError: 'module' object has no attribute 'element_make_factory'

pas moyen de résoudre cela et pourquoi cela se produit-il?

si je print gst j'obtiens ce qui suit: <module 'gst' from '/usr/lib/python2.7/dist-packages/gst-0.10/gst/__init__.pyc'>

c'est donc un module!

1
Ronan Dejhero

Voici du code de travail ... il est toujours en cours (mais cela fonctionne). Il devrait avoir un fichier clair et certains rappels de bouton implémentés. La partie pygi Gst fonctionne cependant.

'''
Example multimedia player

dependencies:
gir and GdkX11

adapted from here:
http://Bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/video-player-1.0
'''

#use gir if you're using quickly...or just use it anyway
from gi.repository import GObject, Gst, Gtk, GdkX11, GstVideo

import os, base64

class DemoFiles:
    '''
    Smashing our .glade file and our mp3 into our py
    '''
    def __init__(self, root):
        self.root = root
        self.glade = '' +\
            ''
        self.testaudio = '' +\
            ''

    def drop_files(self):
        pass

class Settings:
    '''
    Using our home directory
    '''
    def __init__(self, root):
        self.root = root
        home = os.environ['HOME']
        working = os.path.join(home, 'com.example.pygi.gst')
        uri = os.path.join(working, 'makeitbetter.mp3')
        glade = os.path.join(working, 'player.glade')

        self.params = {
                       'HOME': home,
                       'WORKING': working,
                       'DEMOFILE': uri,
                       'GLADE': glade
                       }

    def __call__(self, param):
        return self.params[param]

    def set_param(self, param, data):
        self.params[param] = data
        return True

class Handler:
    '''
    Callbacks for Glade
    '''
    def __init__(self, root):
        self.root = root
        pass

    def on_file_button_clicked(self, *args):
        pass

    def on_file_ok_button_clicked(self, *args):
        print args[0]
        self.root.ui.gst.playbin.set_property('uri', 'file://' + args[0])
        self.root.ui.gst.pipeline.set_state(Gst.State.PLAYING)        

    def on_file_cancel_button_clicked(self, *args):
        pass

    def on_main_win_delete_event(self, *args):
        #clean up our pipeline
        self.root.ui.gst.pipeline.set_state(Gst.State.NULL)
        Gtk.main_quit()   

class GstreamerStuff:
    '''
    All the gstreamer stuff
    '''
    def __init__(self, root):             
        self.root = root

        #Threading init
        GObject.threads_init()
        Gst.init(None)

        # GStreamer init
        self.pipeline = Gst.Pipeline()
        self.bus = self.pipeline.get_bus()
        self.bus.add_signal_watch()
        self.bus.connect('message::eos', self.on_eos)
        self.bus.connect('message::error', self.on_error)

        # This is needed to make the video output in our DrawingArea:
        self.bus.enable_sync_message_emission()
        self.bus.connect('sync-message::element', self.on_sync_message)

        # Create GStreamer elements
        self.playbin = Gst.ElementFactory.make('playbin', None)

        # Add playbin to the pipeline
        self.pipeline.add(self.playbin)

        self.xid = ''

    def on_sync_message(self, bus, msg):
        if msg.get_structure().get_name() == 'prepare-window-handle':
            msg.src.set_window_handle(self.xid)

    def on_eos(self, bus, msg):
        self.root.ui.update_status('Seeking to start of video')
        self.pipeline.seek_simple(
            Gst.Format.TIME,        
            Gst.SeekFlags.FLUSH | Gst.SeekFlags.KEY_UNIT,
            0
        )

    def on_error(self, bus, msg):
        self.root.ui.update_status(msg.parse_error())

    def set_xid(self, xid):
        self.xid = xid

class UI:
    '''
    User interface code
    '''
    def __init__(self, root):
        self.root = root

        #Handle Gtk setup
        self.builder = Gtk.Builder()
        self.handler = Handler(root)
        #Load the glade file
        self.builder.add_from_file(self.root.settings('GLADE'))
        #Connect callbacks
        self.builder.connect_signals(self.handler)

        #Handle Gst setup
        self.gst = GstreamerStuff(root)

    def init(self):
        self.show_main()
        self.gst.set_xid(self.builder.get_object('main_drawing_area').get_property('window').get_xid())

    def show_main(self):
        self.builder.get_object('main_win').show_all()

    def update_status(self, status):
        print('Status bar update')
        self.builder.get_object('status_bar')

class SamplePlayer:
    '''
    Meat
    '''
    def __init__(self):
        #Settings instance
        self.settings = Settings(self)

        #Dump demo files
        demo = DemoFiles(self)
        demo.drop_files()

        #UI Init - I put gstreamer in here
        self.ui = UI(self)

    def run(self):
        self.ui.init()
        print('Trying with: ' + self.settings('DEMOFILE'))
        self.ui.handler.on_file_ok_button_clicked(self.settings('DEMOFILE'))
        Gtk.main()

if __== '__main__':
    player = SamplePlayer()
    player.run()
1
RobotHumans

L'erreur est en fait très simple: le module gst n'a pas de element_make_factory méthode. Jetez un oeil à ma session interactive suivante pour plus d'informations:

>>> import gst
>>> gst.element_make_factory
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'element_make_factory'
>>> gst.some_none_existent_method
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'some_none_existent_method'
>>> dir(gst)
['ACTIVATE_NONE', 'ACTIVATE_PULL', 'ACTIVATE_Push', 'ALLOC_TRACE_LIVE', 

#### Snipping out lots of results...

'warnings', 'xml_make_element', 'xml_write', 'xml_write_file']
>>> 'element_make_factory' in dir(gst)
False
>>> 'element_factory_make' in dir(gst)
True
>>> gst.element_factory_make
<built-in function element_factory_make>
>>>
0
Timo