Removing silence from a stream

Sagar pilkhwal.sagar at gmail.com
Mon Feb 29 10:11:45 UTC 2016


I am using /gst-launch-1.0 -v -t -m filesrc location=myvideo.webm ! decodebin
! audioconvert ! removesilence remove=true ! pulsesink/  what I want is that
the audio to be played with out the silence 

but remove silence doesnt seem to be doing that.


I also tried an alternative method by using /valve/ but there is some
timestamp issue because of which some voice audio is lost.

#define GLIB_DISABLE_DEPRECATION_WARNINGS

#include <gst/gst.h>
#include <string.h>
#include <math.h>

static GMainLoop *loop;
GstElement *play;
GstElement *valve;

int isSpeaking =1;
GstClockTime silencestarttime = 0;
GstClockTime silenceendtime = 0;

static gboolean
my_voice_callback (GstBus     *bus,
		 GstMessage *message,
		 gpointer    data)
{
	if (message->type == GST_MESSAGE_EOS) {
		g_main_loop_quit (loop);
	}
	return TRUE;
}
      
static gboolean
my_bus_callback (GstBus     *bus,
		 GstMessage *message,
		 gpointer    data)
{
  GstClockTime endtime;
  if (message->type == GST_MESSAGE_EOS) {
  	if(isSpeaking ==0){
		silenceendtime = endtime;
		g_print ("\tsilence start time: %" GST_TIME_FORMAT "\n",GST_TIME_ARGS
(silencestarttime));
		g_print ("\tsilence end time: %" GST_TIME_FORMAT "\n",GST_TIME_ARGS
(silenceendtime));
		
  	}
  	g_main_loop_quit (loop);
  }

  if (message->type == GST_MESSAGE_ELEMENT) {
    const GstStructure *s = gst_message_get_structure (message);
    const gchar *name = gst_structure_get_name (s);

    if (strcmp (name, "level") == 0) {
      gint channels;
      GstClockTime starttime;
      
      gdouble rms_dB, peak_dB, decay_dB;
      gdouble rms;
      const GValue *array_val;
      const GValue *value;
      GValueArray *rms_arr, *peak_arr, *decay_arr;
      gint i;

      if (!gst_structure_get_clock_time (s, "endtime", &endtime))
        g_warning ("Could not parse endtime");

	  starttime = endtime - GST_SECOND;	
	
	  if(silencestarttime == 0){
	  	silencestarttime =starttime ;
	  }
	  
	  if(silenceendtime == 0){
	  	silenceendtime =starttime;
	  }
	  
      /* the values are packed into GValueArrays with the value per channel
*/
      array_val = gst_structure_get_value (s, "rms");
      rms_arr = (GValueArray *) g_value_get_boxed (array_val);

      array_val = gst_structure_get_value (s, "peak");
      peak_arr = (GValueArray *) g_value_get_boxed (array_val);

      array_val = gst_structure_get_value (s, "decay");
      decay_arr = (GValueArray *) g_value_get_boxed (array_val);

      /* we can get the number of channels as the length of any of the value
       * arrays */
      channels = rms_arr->n_values;
      
      for (i = 0; i < channels; ++i) {
	    value = g_value_array_get_nth (rms_arr, i);
	    rms_dB = g_value_get_double (value);

	    value = g_value_array_get_nth (peak_arr, i);
	    peak_dB = g_value_get_double (value);

	    value = g_value_array_get_nth (decay_arr, i);
	    decay_dB = g_value_get_double (value);
	    
	    if(rms_dB > -40){
			if(isSpeaking ==0){
				g_object_set(G_OBJECT(valve), "drop", FALSE , NULL);
						
				
				silenceendtime = starttime;
				g_print ("\tsilence start time: %" GST_TIME_FORMAT "\n",GST_TIME_ARGS
(silencestarttime));
				g_print ("\tsilence end time: %" GST_TIME_FORMAT "\n",GST_TIME_ARGS
(silenceendtime));
				
			}
			isSpeaking = 1;
		}
		else{
			if(isSpeaking==1){
				g_object_set(G_OBJECT(valve), "drop", TRUE , NULL);
				silencestarttime = starttime;
			}
			isSpeaking =0;
			g_print ("\nsilence: %" GST_TIME_FORMAT "\n",GST_TIME_ARGS (starttime));
			continue;
		}
      }
    }
  }
  

  /* we want to be notified again the next time there is a message
   * on the bus, so returning TRUE (FALSE means we want to stop watching
   * for messages on the bus and our callback should not be called again)
   */
  return TRUE;
}

int
main (int argc, char *argv[])
{

  GstBus *bus;

  /* gstreamer */
  gst_init (&argc, &argv);
  
  /* we need to run a GLib main loop to get the messages */
  loop = g_main_loop_new (NULL, FALSE);
  
  play = gst_parse_launch("filesrc location=audiosilence.mp4 ! decodebin !
audioconvert !  level interval=1000000000 !tee name=t ! queue ! fakesink t.
! queue ! valve name=valve ! audioconvert ! wavenc !  filesink
location=valve.wav", NULL);
  g_assert (play);
 
 
  bus = gst_pipeline_get_bus (GST_PIPELINE (play));
  gst_bus_add_watch (bus, my_bus_callback, NULL);

  gst_element_set_state (play, GST_STATE_PLAYING);

  valve = gst_bin_get_by_name(GST_PIPELINE (play),"valve");
  g_main_loop_run (loop);
 
  gst_element_set_state (play, GST_STATE_NULL);
  gst_object_unref (GST_OBJECT (play));
  
  gst_object_unref (bus);

  gst_object_unref (GST_OBJECT (valve));
  g_main_loop_unref (loop);
  
  return 0;
}




P.S: What I want to achive is a non silent chunks audio.



--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Removing-silence-from-a-stream-tp973199p4676108.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


More information about the gstreamer-devel mailing list