gstreamer-0.10을 기반으로하는 음악 플레이어를 만들고 있습니다. 나는 성공적으로 플레이 할 수 있지만 파이프 라인의 상태를 변경하면 문제가 발생합니다. 아래 코드를 초기화하고 시작하는 코드를 게시했습니다.gstreramer를 사용하여 노래를 재생할 때 따라야 할 순서는 무엇입니까?
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);
}
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);
}
상기 재생 기능을 수행은 각각 일시 정지 기능. 문제는 파일의 경로를 함수에 보낼 때 start_playbin()
파이프 라인을 준비 상태로 설정 한 후에 파일 경로를 변경할 수 없다는 것입니다. 나는 그것을 만들어야한다 1) 준비 2) 일시 중지 또는 재생 (상태를 설정할 수 없음) 3) 을 중지 한 다음 노래를 재생 (상태 성공 설정)하십시오.
도와주세요. 파이프 라인을 준비만으로 설정했지만 프로그램이 중단되면 오류가 발생하지 않습니다. 무엇이 문제 일 수 있습니까? 파이프 라인을 설정하고 파일의 경로를 설정하기 위해 따라야 할 특정 순서가 있습니까?
안녕하세요, 어디에서 GStreamer 예제를 찾을 수 있습니까? 감사. –
각 자식 모듈에는 하위 디렉토리 테스트/예제가 있습니다. – ensonic