C 使用gstreramer播放歌曲的顺序是什么?
我正在基于gstreamer-0.10构建一个音乐播放器。我能够成功地播放,但当我更改管道状态时,我会遇到问题。我在下面发布了初始化和启动管道的代码:C 使用gstreramer播放歌曲的顺序是什么?,c,embedded,embedded-linux,gstreamer,playbin2,C,Embedded,Embedded Linux,Gstreamer,Playbin2,我正在基于gstreamer-0.10构建一个音乐播放器。我能够成功地播放,但当我更改管道状态时,我会遇到问题。我在下面发布了初始化和启动管道的代码: void start_gstreamer() { gst_init(0,NULL);//call to initialise gstreamer time_val=0;//set to default value volume = 1.0;//set volume to default value play
void start_gstreamer()
{
gst_init(0,NULL);//call to initialise gstreamer
time_val=0;//set to default value
volume = 1.0;//set volume to default value
player = gst_element_factory_make ("playbin2", "player");//get pipeline
equalizer = gst_element_factory_make ("equalizer-10bands", "equalizer");//get the 10band equalizer
convert = gst_element_factory_make ("audioconvert", "convert");
sink = gst_element_factory_make ("autoaudiosink", "audio_sink");//get the audio-sink
if (!equalizer || !convert || !sink)//check is all elements were created
{
g_printerr ("Not all elements could be created.\n");
//return -1;
}
//int i=0;
/* Create the sink bin, add the elements and link them */
bin = gst_bin_new ("audio_sink_bin");//get new bin
gst_bin_add_many (GST_BIN (bin), equalizer, convert, sink, NULL);//add elements to bin
if(!(gst_element_link_many (equalizer, convert, sink, NULL)))//link all elements
g_print("Could not link all elements\n");
pad = gst_element_get_static_pad (equalizer, "sink");//set equalizer to sink
ghost_pad = gst_ghost_pad_new ("sink", pad);//get a ghost pad to sink
gst_pad_set_active (ghost_pad, TRUE);
gst_element_add_pad (bin, ghost_pad);//add ghost pad to the bin
gst_object_unref (pad);//unreference pad
gst_element_set_state (player, GST_STATE_READY);//set pipeline to ready state
//gst_element_set_state (player, GST_STATE_PAUSED);
/* Configure the equalizer */
g_object_set (G_OBJECT (equalizer), "band0",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band1",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band2",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band3",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band4",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band5",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band6",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band7",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band8",(gdouble) 0.0, NULL);
g_object_set (G_OBJECT (equalizer), "band9",(gdouble) 0.0, NULL);
/* Set playbin2's audio sink to be our sink bin */
g_object_set (GST_OBJECT (player), "audio-sink", bin, NULL);
}
上述代码将初始化gstreamer管道。我正在使用playbin2
void start_playbin (char *gargv1)
{
time_t rawtime;
struct tm * timeinfo;
static gboolean i=TRUE;
gchar* uri;//to hold the path temporarily
gchar* dname;//to hold the directory name
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "START:%s\n", asctime (timeinfo) );
uri = (gchar *)g_malloc( sizeof("file://") + strlen(gargv1) + 1);//get complete path
strcpy(uri,"file://");
strcat(uri,gargv1);//add path with the file path
dname = g_uri_escape_string(uri,G_URI_RESERVED_CHARS_ALLOWED_IN_PATH,TRUE);
g_free(uri);
uri = dname;
g_object_set(player,"uri",uri,NULL);//set file path for playback in the pipeline
g_print("\n\nPlaying %s\n", gargv1);
g_free(uri);//free path
/* start playback */
gst_element_set_state (GST_ELEMENT (player), GST_STATE_READY);//set pipeline to ready state
if(i==TRUE)
{
unsigned int count=0;
while(gst_element_set_state (GST_ELEMENT (player), GST_STATE_PLAYING)!=GST_STATE_CHANGE_SUCCESS);
//g_print("here:%d\n",count++);
i=FALSE;
}
else
play_playbin();//start playback
bus = gst_pipeline_get_bus(GST_PIPELINE(player));//get bus reference
gst_bus_add_watch(bus,(GstBusFunc)cb_message,player);//add bus to be monitored by process events
g_object_unref(bus);//unreference bus
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ( "AFTER START:%s\n", asctime (timeinfo) );
}
我不得不使用if(I==TRUE)条件,因为管道第一次没有改变状态
void stop_playbin()
{
if(gst_element_set_state (GST_ELEMENT (player), GST_STATE_NULL)!=GST_STATE_CHANGE_SUCCESS)
g_print("Playbin could not be stopped\n");
//g_assert(gst_element_set_state (GST_ELEMENT (player),GST_STATE_NULL)==GST_STATE_CHANGE_SUCCESS);
}
void pause_playbin()
{
if(gst_element_set_state (GST_ELEMENT (player), GST_STATE_PAUSED)!=GST_STATE_CHANGE_SUCCESS)
g_print("Playbin could not be paused\n");
//g_assert(gst_element_set_state (GST_ELEMENT (player), GST_STATE_PAUSED)==GST_STATE_CHANGE_SUCCESS);
}
上述功能分别执行播放、暂停和停止功能。问题是,当我将文件路径发送到函数start\u playbin()
时,我无法在将管道仅设置为就绪后更改文件路径。我必须去
1) 准备好了吗
2) 暂停或播放(无法设置状态)
3) 停止
然后播放(设置状态成功)歌曲
请帮帮我。如果将管道设置为“仅准备就绪”,但程序挂起,则不会出现任何错误。有什么问题吗?设置管道和设置文件路径时是否需要遵循特定的顺序 请查看gstreamer附带的示例。有几点:
- 您需要将管道的状态设置回ready,以便能够更改uri
- 状态更改是异步的。请阅读有关GstBus的信息并加以利用。尤其是玩完游戏后不要坐在公共汽车上。创建playbin管道并连接到总线。然后您可以进入播放,总线将通知您播放何时开始,何时结束(以及其他事项)
也可以考虑使用1作为一个新的应用程序,0.10是在维护模式下。谢谢。每个git模块都有子目录测试/示例。
void play_playbin()
{
if(gst_element_set_state (GST_ELEMENT (player), GST_STATE_PLAYING)!=GST_STATE_CHANGE_SUCCESS)
g_print("Playbin could not be played\n");
//g_assert(gst_element_set_state (GST_ELEMENT (player),GST_STATE_PLAYING)==GST_STATE_CHANGE_SUCCESS);
}