Android - Convert .wav to .ogg is too slow

cxphong caoxuanphong.khtn at
Tue Apr 1 07:06:56 PDT 2014

I converted a audio file with .wav  extension to .ogg. 
wav file is about 100MB.
On ubuntu, the conversion takes about 10s, but on android it take about
5min. It's too long.

Could anyone help me to show the problem?. And Are there better way to
convert wav to ogg on android?

Thank all!

My code:

static gboolean
bus_call (GstBus     *bus,
          GstMessage *msg,
          gpointer    data)
  GMainLoop *loop = (GMainLoop *) data;

  switch (GST_MESSAGE_TYPE (msg)) {

      g_print ("End of stream\n");
      g_main_loop_quit (loop);

      gchar  *debug;
      GError *error;

      gst_message_parse_error (msg, &error, &debug);
      g_printerr ("Debug = %s\n", debug);
      g_free (debug);

      g_printerr ("Error: %s\n", error->message);
      g_error_free (error);

      g_main_loop_quit (loop);

  return TRUE;

static void
on_pad_added (GstElement *element,
              GstPad     *pad,
              gpointer    data)
  GstPad *sinkpad;
  GstElement *decoder = (GstElement *) data;

  /* We can now link this pad with the vorbis-decoder sink pad */
  g_print ("Dynamic pad created, linking demuxer/decoder\n");

  sinkpad = gst_element_get_static_pad (decoder, "sink");

  gst_pad_link (pad, sinkpad);

  gst_object_unref (sinkpad);

int convert_wav_to_ogg (const char* songname)
	GMainLoop *loop;

	  GstElement *pipeline, *source, *wavparse, *conv, *vorbisenc, *oggmux,
*filesink, *fakesink;
	  GstBus *bus;
	  guint bus_watch_id;

	  setenv("GST_DEBUG", "*:2", NULL);
	  /* Initialisation */
	  gst_init (NULL, NULL);

	  loop = g_main_loop_new (NULL, FALSE);

	  /* Create gstreamer elements */
	  pipeline = gst_pipeline_new ("audio-player");
	  source   = gst_element_factory_make ("filesrc", NULL);
	  wavparse = gst_element_factory_make ("wavparse", NULL);
	  conv     = gst_element_factory_make ("audioconvert", NULL);
	  vorbisenc = gst_element_factory_make ("vorbisenc", NULL);
	  oggmux = gst_element_factory_make ("oggmux", NULL);
	  fakesink = gst_element_factory_make ("fakesink", NULL);
	  filesink     = gst_element_factory_make ("filesink", NULL);

	  if (!pipeline || !source || !wavparse || !conv || !vorbisenc || !oggmux
|| !filesink) {
		g_printerr ("One element could not be created. Exiting.\n");
		return -1;

	  /* Set up the pipeline */

	  /* we set the input filename to the source element */
	  g_object_set (G_OBJECT (source), "location", "/sdcard/output.wav", NULL);
	  g_object_set (G_OBJECT (filesink), "location", "/sdcard/xxx.ogg", NULL);

	  /* we add a message handler */
	  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
	  bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
	  gst_object_unref (bus);

	  /* we add all elements into the pipeline */
	  /* file-source | ogg-demuxer | vorbis-decoder | converter | alsa-output
	  gst_bin_add_many (GST_BIN (pipeline),
						source, wavparse, conv, vorbisenc, oggmux, filesink, NULL);

	  /* we link the elements together */
	  /* file-source -> ogg-demuxer ~> vorbis-decoder -> converter ->
alsa-output */
	  //gst_element_link_many (source, wavparse, conv, vorbisenc, oggmux,
filesink, NULL);
	gst_element_link_many (source, wavparse, NULL);
	gst_element_link_many (conv, vorbisenc, oggmux, filesink, NULL);
	g_signal_connect (wavparse, "pad-added", G_CALLBACK (on_pad_added), conv);

	  /* note that the demuxer will be linked to the decoder dynamically.
		 The reason is that Ogg may contain various streams (for example
		 audio and video). The source pad(s) will be created at run time,
		 by the demuxer when it detects the amount and nature of streams.
		 Therefore we connect a callback function which will be executed
		 when the "pad-added" is emitted.*/

	  /* Set the pipeline to "playing" state*/
	  gst_element_set_state (pipeline, GST_STATE_PLAYING);

	  /* Iterate */
	  g_print ("Running...\n");
	  g_main_loop_run (loop);

	  /* Out of the main loop, clean up nicely */
	  g_print ("Returned, stopping playback\n");
	  gst_element_set_state (pipeline, GST_STATE_NULL);

	  g_print ("Deleting pipeline\n");
	  gst_object_unref (GST_OBJECT (pipeline));
	  g_source_remove (bus_watch_id);
	  g_main_loop_unref (loop);

	  return 0;

View this message in context:
Sent from the GStreamer-devel mailing list archive at

More information about the gstreamer-devel mailing list