2010-08-16 4 views
1

ok, j'ai quelque chose comme ceci:comment envoyer un message EOS au bus

self.pipeline = gst.Pipeline() 

    self.tee = gst.element_factory_make 

    self.source = gst.element_factory_make('subdevsrc') 
    self.source.set_property('viewfinder-mode', 1) 
    self.source.set_property('camera-device', 1) 

    self.capsfilter = gst.element_factory_make('capsfilter') 
    caps = 'video/x-raw-yuv, width=640, height=480' 
    self.capsfilter.set_property('caps', gst.caps_from_string(caps)) 

    self.tee = gst.element_factory_make('tee') 

    self.queue1 = gst.element_factory_make('queue') 
    self.queue2 = gst.element_factory_make('queue') 

    self.encoder = gst.element_factory_make('dsphdmp4venc') 
    self.muxer = gst.element_factory_make('mp4mux') 
    self.imagesink = gst.element_factory_make('xvimagesink') 

    self.filesink = gst.element_factory_make('filesink') 
    self.filesink.set_property('location', '/dev/null') 

    self.pipeline.add(self.source, self.capsfilter, self.tee, self.queue1, self.queue2, self.encoder, self.muxer, self.imagesink, self.filesink) 
    gst.element_link_many(self.source, self.capsfilter, self.tee, self.queue1, self.imagesink) 
    gst.element_link_many(self.tee, self.queue2, self.encoder, self.muxer, self.filesink) 

    self.bus = self.pipeline.get_bus() 

Je veux arrêter (EOS) le flux dans l'état prêt, changer l'emplacement et ainsi .. aide?

self.bus.emit ('eos') me donne TypeError:: Nom du signal inconnu: eos

+0

donc je dois appelez gst_element_send_event() et envoyez gst_event_new_eos() mais où est cette méthode gst_element_send_event? – manson54

+0

alors j'ai appelé self.pipeline.send_event (gst.event_new_eos()) et j'ai eu output_loop: l'eos d'urgence a été déclenché. mais je dois changer l'emplacement sans haleine pour aller à l'état nul – manson54

+0

Je ne sais pas exactement ce que vous voulez faire. Si vous voulez changer l'état du pipeline, 'gst_element_set_state (pipeline, GST_STATE_READY); Si vous voulez envoyer un message eos au bus, utilisez 'gst_message_new_eos()' pour le créer. –

Répondre

0

bien je l'ai résolu en quelque sorte:

J'ajouté

self.bus = self.pipeline.get_bus() 
self.bus.connect('message::eos', self.on_eos) 
self.loop = gobject.MainLoop() 

et trois méthodes:

def location(self, filename): 
    self.ready() 
    gst.element_unlink_many(self.muxer, self.filesink) 
    self.filesink.set_state(gst.STATE_NULL) 
    self.filesink.set_property('location', filename) 
    self.filesink.set_state(gst.STATE_READY) 
    gst.element_link_many(self.muxer, self.filesink) 
    self.run() 
    if self.pipeline.get_state()[1] != gst.STATE_PLAYING: 
     self.stop() 


def eos(self): 
    self.bus.add_signal_watch() 
    self.pipeline.send_event(gst.event_new_eos()) 
    try: 
     self.loop.run() 
    except KeyboardInterrupt: 
     self.on_eos(None,None) 


def on_eos(self, bus, msg): 
    self.loop.quit() 
    self.bus.remove_signal_watch() 
    self.location('/dev/null')