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