View Single 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