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
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()))
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}')
) 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)