- 论坛徽章:
- 1
|
- leos@leos-laptop:gstreamer-code $ cat gst.c
- /*
- * gcc gst.c -o gst `pkg-config --libs --cflags gstreamer-0.10`
- * */
- #include <gst/gst.h>
- #include <glib.h>
- GstElement *pipeline;//定义组件
- gchar *curtime,*altime;
- //定义消息处理函数,
- static gboolean bus_call(GstBus *bus,GstMessage *msg,gpointer data)
- {
- GMainLoop *loop = (GMainLoop *) data;//这个是主循环的指针,在接受EOS消息时退出循环
- switch (GST_MESSAGE_TYPE(msg))
- {
- case GST_MESSAGE_EOS:
- g_print("End of stream\n");
- g_main_loop_quit(loop);
- break;
- case GST_MESSAGE_ERROR:
- {
- gchar *debug;
- GError *error;
- gst_message_parse_error(msg,&error,&debug);
- g_free(debug);
- g_printerr("ERROR:%s\n",error->message);
- g_error_free(error);
- g_main_loop_quit(loop);
- break;
- }
- default:
- break;
- }
- return TRUE;
- }
- gboolean hello (gpointer data)
- {
- GstFormat fm = GST_FORMAT_TIME;
- gint64 pos,len;
- gst_element_query_duration (pipeline, &fm, &len);
- g_print("length == %"G_GINT64_FORMAT,len);
- g_print("\n");
- gst_element_query_position (pipeline, &fm, &pos);
- g_print("Current ... is %"G_GINT64_FORMAT,pos);
- g_print("\n");
- g_print("rate of progress : %f%\n",1.0*pos/len*100);
- g_print("===================================\n");
- g_snprintf(curtime, 24, "%u:%02u:%02u", GST_TIME_ARGS(pos));
- g_snprintf(altime, 24, "%u:%02u:%02u", GST_TIME_ARGS(len));
- g_print("The time is %s / %s\n",curtime,altime);
- return TRUE;//继续往下执行,返回FALSE 不再继续
- }
- int main(int argc,char *argv[])
- {
- GMainLoop *loop;
- GstBus *bus;
- curtime = (gchar *)malloc(25);
- altime = (gchar *)malloc(25);
- gst_init(&argc,&argv);
- loop = g_main_loop_new(NULL,FALSE);//创建主循环,在执行 g_main_loop_run后正式开始循环
- if(argc != 2)
- {
- g_printerr("Usage:%s <mp3 filename>\n",argv[0]);
- return -1;
- }
- //创建管道和组件
- pipeline = gst_element_factory_make("playbin","play");
- if(!pipeline){
- g_printerr("One element could not be created.Exiting.\n");
- return -1;
- }
- //设置 source的location 参数。即 文件地址.
- //g_object_set(G_OBJECT(source),"location",argv[1],NULL);
- g_object_set(G_OBJECT(pipeline),"uri",argv[1],NULL);
- //得到 管道的消息总线
- bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
- //添加消息监视器
- gst_bus_add_watch(bus,bus_call,loop);
- gst_object_unref(bus);
- //开始播放
- gst_element_set_state(pipeline,GST_STATE_PLAYING);
- g_print("\nRunning\n");
- g_timeout_add(1000,hello,NULL);
- //开始循环
- g_main_loop_run(loop);
- g_print("Returned,stopping playback\n");
- gst_element_set_state(pipeline,GST_STATE_NULL);
- gst_object_unref(GST_OBJECT(pipeline));
- return 0;
- }
复制代码 |
|