Esempio n. 1
0
    def gstreamer_message(self, bus, message):
        # https://gstreamer.freedesktop.org/documentation/gstreamer/gstmessage.html?gi-language=c#GstMessageType
        # https://gstreamer.freedesktop.org/documentation/gstreamer/gsttaglist.html?gi-language=c

        # Look for GST_DEBUG: https://gstreamer.freedesktop.org/documentation/gstreamer/running.html?gi-language=c

        msg_kind = [
            gst.MessageType.EOS,
            #gst.MessageType.TAG,
            gst.MessageType.ERROR,
            gst.MessageType.WARNING,
            gst.MessageType.INFO,
        ]
        """
		def extract(raw_meta,kind):
			count = raw_meta.get_tag_size(kind)
			for i in range(count):
				value = raw_meta.get_value_index(kind, i)
				print(kind, i, "::", value)
		"""
        t = message.type
        m = gst.message_type_get_name(t)

        if t == gst.MessageType.EOS:
            self.gsbin.set_state(gst.State.NULL)
            print("The song is ended!")
            """
		# Get the metadata using GStreamer
		# It will keep updating the data as the music plays because it's updating bitrate value.
		elif t == gst.MessageType.TAG:
			raw_meta = message.parse_tag()
			raw_meta.foreach(extract)
			"""
        elif t == gst.MessageType.ERROR:
            self.gsbin.set_state(gst.State.NULL)
            err, debug = message.parse_error()
            print(err, debug)
        elif t == gst.MessageType.WARNING:
            err, debug = message.parse_warning()
            print(err, debug)
        elif t == gst.MessageType.INFO:
            err, debug = message.parse_info()
            print(err, debug)
        elif t == gst.MessageType.STATE_CHANGED:
            old, new, pending = message.parse_state_changed()
            if old == gst.State.READY and pending == gst.State.PLAYING:
                self.meta["nanosecs"] = self.gsbin.query_duration(
                    gst.Format.TIME)[1]
                self.ui.update_song_timestamp()

        if t in msg_kind:
            print("")  # just an empty space to be more readable
Esempio n. 2
0
 def gstMessageHandler(self, bus, message):
     debug(DEBUG, '%s gstMessageHandler: %s',self, Gst.message_type_get_name(message.type))
     
     if (message.type == Gst.MessageType.ELEMENT):
         # parse element message
         if message.get_structure().get_name() == "prepare-window-handle":
             # this work for xvimagesink
             #print('----------> prepare-window-handle')
             self.sink = message.src
             self.sink.set_property("force-aspect-ratio", True)
             self.sink.set_window_handle(self.wnd_handler.get_window().get_xid())
         elif message.get_structure().get_name() == "have-window-handle":
             pass 
 def sync_message_handler(self, bus, msg):
     """
     'sync-message' message callback
     """
     if msg.type is Gst.MessageType.ELEMENT:
         if msg.src is self.cutter:
             above = msg.get_structure().get_value('above')
             self.log.info("Got synch-msg of type %s from %s: above=%s" %
                           (Gst.message_type_get_name(
                               msg.type), msg.src.get_name(), above))
             if above:
                 # send incoming audio to the decoder
                 self.asr.set_property('silent', False)
             else:
                 # don't send incoming audio to the decoder
                 self.asr.set_property('silent', True)
     if msg.type is Gst.MessageType.STATE_CHANGED:
         old_state, new_state, pending_state = msg.parse_state_changed()
         self.log.info(
             "Got sync-msg of type %s from %s: %s -> %s" %
             (Gst.message_type_get_name(msg.type), msg.src.get_name(),
              Gst.Element.state_get_name(old_state),
              Gst.Element.state_get_name(new_state)))
     elif msg.type is Gst.MessageType.STREAM_STATUS:
         status_type, owner = msg.parse_stream_status()
         self.log.info("Got sync-msg of type %s from %s: status_type=%s" %
                       (Gst.message_type_get_name(
                           msg.type), owner.get_name(), status_type))
     elif msg.type is Gst.MessageType.TAG:
         tag_list = msg.parse_tag()
         self.log.info("Got sync-msg of type %s from %s: %s" %
                       (Gst.message_type_get_name(msg.type),
                        msg.src.get_name(), tag_list.to_string()))
     else:
         self.log.info(
             "Got sync-msg of type %s from %s" %
             (Gst.message_type_get_name(msg.type), msg.src.get_name()))
Esempio n. 4
0
Gst.init()
pipeline = Gst.parse_launch(f'''
    filesrc location=media/in.mp4 num-buffers=256 !
    decodebin !
    nvvideoconvert !
    video/x-raw,format={frame_format} !
    fakesink name=s
''')

pipeline.get_by_name('s').get_static_pad('sink').add_probe(
    Gst.PadProbeType.BUFFER, on_frame_probe)

pipeline.set_state(Gst.State.PLAYING)

try:
    while True:
        msg = pipeline.get_bus().timed_pop_filtered(
            Gst.SECOND, Gst.MessageType.EOS | Gst.MessageType.ERROR)
        if msg:
            text = msg.get_structure().to_string() if msg.get_structure(
            ) else ''
            msg_type = Gst.message_type_get_name(msg.type)
            print(f'{msg.src.name}: [{msg_type}] {text}')
            break
finally:
    finish_time = time.time()
    open(f'logs/{os.path.splitext(sys.argv[0])[0]}.pipeline.dot', 'w').write(
        Gst.debug_bin_to_dot_data(pipeline, Gst.DebugGraphDetails.ALL))
    pipeline.set_state(Gst.State.NULL)
    print(f'FPS: {frames_processed / (finish_time - start_time):.2f}')
Esempio n. 5
0
                )
                print("Pipeline changed from {0} to {1}.".format(
                    old_state.value_nick, new_state.value_nick))
        elif message.type == Gst.MessageType.ERROR:
            err, msg = message.parse_error()
            print("Error: {0}: {1}".format(err, msg))
            break
        elif message.type == Gst.MessageType.WARNING:
            err, msg = message.parse_warning()
            print("Warning: {0}: {1}".format(err, msg))
        elif message.type == Gst.MessageType.TAG:
            tag_list = message.parse_tag()
            for n in range(tag_list.n_tags()):
                tag = str(tag_list.nth_tag_name(n))
                for i in range(tag_list.get_tag_size(tag)):
                    value = str(tag_list.get_value_index(tag, i))
                    if tag not in tags or tags[tag] != value:
                        tags[tag] = value
                        print("{0}: {1}".format(tag, value))
        else:
            print("Message from {0}: {1}".format(
                message.src.get_name(),
                Gst.message_type_get_name(message.type)))
except (KeyboardInterrupt, SystemExit):
    print("User exit, shutting down")
    # dump current pipeline to file, use "dot -Tpdf *.dot > *.pdf" to make readable
    # Gst.print_bin_to_dot_file_with_ts(pipe,Gst.printGraphDetails.ALL,"state")
finally:
    # cleanup
    pipe.set_state(Gst.State.NULL)