Reply
Thread Tools
Posts: 2 | Thanked: 0 times | Joined on Feb 2010
#1
Hi,

I am not familiar with GStreamer and AAC format. I am writing some test application for encoding an audio file in AAC format without success : my output file is empty!
---------------------------------------------------------------------
#include <stdio.h>
#include <glib.h>
#include <gst/gst.h>
#include <libgnomevfs/gnome-vfs.h>

static gboolean
cb_bus(GstBus *bus, GstMessage *msg, gpointer user_data)
{
GMainLoop *loop;

loop = user_data;
switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_EOS:
g_main_loop_quit(loop);
g_print("End of encoding\n");
break;
case GST_MESSAGE_ERROR:
break;
g_print("err: terminating ...\n");
g_main_loop_quit(loop);
default:
break;
}

return TRUE;
}


static void
cb_pad_added(GstElement *element, GstPad *pad, gpointer user_data)
{
GstCaps *caps;
GstStructure *str;
GstPad *audiopad;
GstElement *audiobin;

audiobin = user_data;

audiopad = gst_element_get_static_pad(audiobin, "sink");
if (GST_PAD_IS_LINKED(audiopad)) {
g_object_unref(audiopad);
return;
}

caps = gst_pad_get_caps (pad);
str = gst_caps_get_structure (caps, 0);
if (!g_strrstr (gst_structure_get_name (str), "audio")) {
gst_caps_unref (caps);
gst_object_unref (audiopad);
return;
}
gst_caps_unref (caps);

gst_pad_link (pad, audiopad);
g_object_unref (audiopad);
}


int main(int argc, char *argv[])
{
GMainLoop *loop;
GstElement *pipeline, *audiobin;
GstPad *audiopad;
GstElement *source, *decoder, *convert, *encoder, *sink;
GstElement *m4acapsfilter = NULL;
GstBus *bus;
const gchar *savefilename;
gchar *savepath;
gint format;

if (argc != 3) {
fprintf(stderr,
"usage: %s [input] [output format 1=WAV, 2=MP3, 3=MP4]\n",
argv[0]);
return 1;
}

format = atoi(argv[2]);
if ((format != 1) && (format != 2) && (format != 3)) {
fprintf(stderr,
"usage: %s [input] [output format 1=WAV, 2=MP3, 3=MP4]\n",
argv[0]);
return 1;
}

g_thread_init(NULL);
if(!gnome_vfs_init()) {
return 1;
}
gst_init(&argc, &argv);

loop = g_main_loop_new(NULL, FALSE);

pipeline = gst_pipeline_new("pipeline");
if (!pipeline) {
fprintf(stderr, "err: create pipeline failed\n");
return 1;
}

bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
gst_bus_add_watch(bus, cb_bus, loop);
gst_object_unref(bus);

source = gst_element_factory_make("filesrc", NULL);
if (!source) {
fprintf(stderr, "err: create filesrc failed\n");
return 1;
}
g_object_set(G_OBJECT(source), "location", argv[1], NULL);

decoder = gst_element_factory_make("decodebin2", NULL);
if (!decoder) {
fprintf(stderr, "err: create decodebin2 failed\n");
return 1;
}

convert = gst_element_factory_make("audioconvert", NULL);
if (!convert) {
fprintf(stderr, "err: create audioconvert failed\n");
return 1;
}

if (format == 1) {
g_print("output testWAV.wav\n");
encoder = gst_element_factory_make("wavenc", NULL);
if (!encoder) {
fprintf(stderr, "err: create encoder waveenc failed\n");
return 1;
}
} else if (format == 2) {
g_print("output testMP3.mp3\n");
encoder = gst_element_factory_make("twolame", NULL);
if (!encoder) {
fprintf(stderr, "err: create encoder twolame failed\n");
return 1;
}
g_object_set(G_OBJECT(encoder), "bitrate", 128, NULL);
} else {
gint bitrate, width, depth, rate, channels;
GstCaps *caps;
GstStructure *gst_struct;

g_print("output testMP4.m4a\n");
encoder = gst_element_factory_make("nokiaaacenc", NULL);
if (!encoder) {
fprintf(stderr, "err: create encoder nokiaaacenc failed\n");
return 1;
}
bitrate = 128000;
width = 16;
depth = 16;
rate = 48000;
channels = 1;

caps = gst_caps_new_empty();
gst_struct = gst_structure_empty_new("audio/x-raw-int");
gst_structure_set(gst_struct, "width", G_TYPE_INT, width,
NULL);
gst_structure_set(gst_struct, "depth", G_TYPE_INT, depth,
NULL);
gst_structure_set(gst_struct, "rate", G_TYPE_INT, rate,
NULL);
gst_structure_set(gst_struct, "channels", G_TYPE_INT, channels,
NULL);
gst_caps_merge_structure(caps, gst_struct);
m4acapsfilter = gst_element_factory_make("capsfilter", NULL);
g_object_set (m4acapsfilter, "caps", caps, NULL);
gst_caps_unref (caps);

encoder = gst_element_factory_make("nokiaaacenc", NULL);
g_object_set (G_OBJECT(encoder), "bitrate", bitrate, NULL);
}

sink = gst_element_factory_make("filesink", "sink");
if(!sink) {
fprintf(stderr, "err: create fileseink failed\n");
return 1;
}
if (format == 1) {
savefilename = "testWAV.wav";
} else if (format == 2) {
savefilename = "testMP3.mp3";
} else {
savefilename = "testM4A.m4a";
}
savepath = g_strconcat(g_getenv("HOME"), "/MyDocs/.sounds/",
savefilename, NULL);
g_object_set(G_OBJECT(sink), "location", savepath, NULL);

audiobin = gst_bin_new ("audiobin");

if(format == 3) {
gst_bin_add(GST_BIN(audiobin), m4acapsfilter);
}
gst_bin_add_many(GST_BIN(audiobin), convert, encoder, sink, NULL);
if(format == 3) {
gst_element_link_many(convert, m4acapsfilter, encoder, sink, NULL);
} else {
gst_element_link_many(convert, encoder, sink, NULL);
}
audiopad = gst_element_get_static_pad(convert, "sink");
gst_element_add_pad(audiobin, gst_ghost_pad_new ("sink", audiopad));
gst_object_unref(audiopad);
gst_bin_add(GST_BIN(pipeline), audiobin);

gst_bin_add_many(GST_BIN(pipeline), source, decoder, NULL);
gst_element_link(source, decoder);
g_signal_connect(decoder, "pad-added", G_CALLBACK(cb_pad_added),
audiobin);

gst_element_set_state(pipeline, GST_STATE_PLAYING);

g_print("Run...\n");
g_main_loop_run(loop);

gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(GST_OBJECT(pipeline));
pipeline = NULL;

return 0;
}
--------------------------------------------------------------------------------

Anybody can help ?
Thanks!
 
Posts: 168 | Thanked: 265 times | Joined on Oct 2009 @ London, UK
#2
You should add an audioresamle gstreamer element before the capsfilter to ensure that you get the sample rate out that you are forcing with the capsfilter even if the source file has a different sample rate.
 

The Following User Says Thank You to zaheerm For This Useful Post:
Posts: 432 | Thanked: 645 times | Joined on Mar 2009
#3
Originally Posted by Elvis View Post
Hi,

I am not familiar with GStreamer and AAC format. I am writing some test application for encoding an audio file in AAC format without success : my output file is empty!
Code:
---------------------------------------------------------------------
#include <stdio.h>
#include <glib.h>
#include <gst/gst.h>
#include <libgnomevfs/gnome-vfs.h>

static gboolean
cb_bus(GstBus *bus, GstMessage *msg, gpointer user_data)
{
GMainLoop *loop;

    loop = user_data;
    switch (GST_MESSAGE_TYPE (msg)) {
        case GST_MESSAGE_EOS:
            g_main_loop_quit(loop);
            g_print("End of encoding\n");
            break;
        case GST_MESSAGE_ERROR:
            break;
            g_print("err: terminating ...\n");
            g_main_loop_quit(loop);
        default:
        break;
    }

    return TRUE;
}


static void
cb_pad_added(GstElement *element, GstPad *pad, gpointer user_data)
{
    GstCaps *caps;
    GstStructure *str;
    GstPad *audiopad;
    GstElement *audiobin;

    audiobin = user_data;

    audiopad = gst_element_get_static_pad(audiobin, "sink");
    if (GST_PAD_IS_LINKED(audiopad)) {
        g_object_unref(audiopad);
        return;
    }

    caps = gst_pad_get_caps (pad);
    str = gst_caps_get_structure (caps, 0);
    if (!g_strrstr (gst_structure_get_name (str), "audio")) {
        gst_caps_unref (caps);
        gst_object_unref (audiopad);
        return;
    }
    gst_caps_unref (caps);

    gst_pad_link (pad, audiopad);
    g_object_unref (audiopad);
}


int main(int argc, char *argv[])
{
    GMainLoop *loop;
    GstElement *pipeline, *audiobin;
    GstPad *audiopad;
    GstElement *source, *decoder, *convert, *encoder, *sink;
    GstElement *m4acapsfilter = NULL;
    GstBus *bus;
    const gchar *savefilename;
    gchar *savepath;
    gint format;

    if (argc != 3) {
        fprintf(stderr,
                "usage: %s [input] [output format 1=WAV, 2=MP3, 3=MP4]\n",
                argv[0]);
        return 1;
    }

    format = atoi(argv[2]);
    if ((format != 1) && (format != 2) && (format != 3)) {
        fprintf(stderr,
                "usage: %s [input] [output format 1=WAV, 2=MP3, 3=MP4]\n",
                argv[0]);
        return 1;
    }

    g_thread_init(NULL);
    if(!gnome_vfs_init()) {
        return 1;
    }
    gst_init(&argc, &argv);

    loop = g_main_loop_new(NULL, FALSE);

    pipeline = gst_pipeline_new("pipeline");
    if (!pipeline) {
        fprintf(stderr, "err: create pipeline failed\n");
        return 1;
    }

    bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
    gst_bus_add_watch(bus, cb_bus, loop);
    gst_object_unref(bus);

    source = gst_element_factory_make("filesrc", NULL);
    if (!source) {
        fprintf(stderr, "err: create filesrc failed\n");
        return 1;
    }
    g_object_set(G_OBJECT(source), "location", argv[1], NULL);

    decoder = gst_element_factory_make("decodebin2", NULL);
    if (!decoder) {
        fprintf(stderr, "err: create decodebin2 failed\n");
        return 1;
    }

    convert = gst_element_factory_make("audioconvert", NULL);
    if (!convert) {
        fprintf(stderr, "err: create audioconvert failed\n");
        return 1;
    }

    if (format == 1) {
        g_print("output testWAV.wav\n");
        encoder = gst_element_factory_make("wavenc", NULL);
        if (!encoder) {
            fprintf(stderr, "err: create encoder waveenc failed\n");
            return 1;
        }
    } else if (format == 2) {
        g_print("output testMP3.mp3\n");
        encoder = gst_element_factory_make("twolame", NULL);
        if (!encoder) {
            fprintf(stderr, "err: create encoder twolame failed\n");
            return 1;
        }
        g_object_set(G_OBJECT(encoder), "bitrate", 128, NULL);
    } else {
        gint bitrate, width, depth, rate, channels;
        GstCaps *caps;
        GstStructure *gst_struct;

        g_print("output testMP4.m4a\n");
        encoder = gst_element_factory_make("nokiaaacenc", NULL);
        if (!encoder) {
            fprintf(stderr, "err: create encoder nokiaaacenc failed\n");
            return 1;
        }
        bitrate = 128000;
	width = 16;
	depth = 16;
	rate = 48000;
	channels = 1;

        caps = gst_caps_new_empty();
        gst_struct = gst_structure_empty_new("audio/x-raw-int");
        gst_structure_set(gst_struct, "width", G_TYPE_INT, width,
                          NULL);
        gst_structure_set(gst_struct, "depth", G_TYPE_INT, depth,
                          NULL);
        gst_structure_set(gst_struct, "rate", G_TYPE_INT, rate,
                          NULL);
        gst_structure_set(gst_struct, "channels", G_TYPE_INT, channels,
                          NULL);
        gst_caps_merge_structure(caps, gst_struct);
        m4acapsfilter = gst_element_factory_make("capsfilter", NULL);
	    g_object_set (m4acapsfilter, "caps", caps, NULL);
	    gst_caps_unref (caps);

        encoder = gst_element_factory_make("nokiaaacenc", NULL);
        g_object_set (G_OBJECT(encoder), "bitrate", bitrate, NULL);
    }

    sink = gst_element_factory_make("filesink", "sink");
    if(!sink) {
        fprintf(stderr, "err: create fileseink failed\n");
        return 1;
    }
    if (format == 1) {
        savefilename = "testWAV.wav";    
    } else if (format == 2) {
        savefilename = "testMP3.mp3";    
    } else {
        savefilename = "testM4A.m4a";    
    }
    savepath = g_strconcat(g_getenv("HOME"), "/MyDocs/.sounds/",
                           savefilename, NULL);
    g_object_set(G_OBJECT(sink), "location", savepath, NULL);

    audiobin = gst_bin_new ("audiobin");

    if(format == 3) {    
        gst_bin_add(GST_BIN(audiobin), m4acapsfilter);
    }
    gst_bin_add_many(GST_BIN(audiobin), convert, encoder, sink, NULL);
    if(format == 3) {    
	    gst_element_link_many(convert, m4acapsfilter, encoder, sink, NULL);
    } else {
        gst_element_link_many(convert, encoder, sink, NULL);
    }
    audiopad = gst_element_get_static_pad(convert, "sink");
    gst_element_add_pad(audiobin, gst_ghost_pad_new ("sink", audiopad));
    gst_object_unref(audiopad);
    gst_bin_add(GST_BIN(pipeline), audiobin);

    gst_bin_add_many(GST_BIN(pipeline), source, decoder, NULL);
    gst_element_link(source, decoder);
    g_signal_connect(decoder, "pad-added", G_CALLBACK(cb_pad_added),
                     audiobin);

    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    g_print("Run...\n");
    g_main_loop_run(loop);

    gst_element_set_state(pipeline, GST_STATE_NULL);
    gst_object_unref(GST_OBJECT(pipeline));
    pipeline = NULL;

    return 0;
}
And a small hint. Please use the code tags for the next time, when you paste code related stuff. This makes the thread much more readable.

Thanks, Daniel
 
Posts: 883 | Thanked: 980 times | Joined on Jul 2007 @ Bern, Switzerland
#4
Download my recaller widget and take a look at the sourcecode (even if it's in Python). One of the most important thing is to send down a GST_MESSAGE_EOS through the pipeline when you end the recording.
__________________
-Tom (N900, N810, N800)

"the idea of truly having a computer in your pocket just moved a big step closer."
 

The Following User Says Thank You to twaelti For This Useful Post:
Posts: 2 | Thanked: 0 times | Joined on Feb 2010
#5
I've add audioresample next to audioconvert, and add "output-format" = 1 to nokiaaacenc properties.

Now, it's working thanks!
 
Reply


 
Forum Jump


All times are GMT. The time now is 11:56.