2013-08-29 1 views
1

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) 을 중지 한 다음 노래를 재생 (상태 성공 설정)하십시오.

도와주세요. 파이프 라인을 준비만으로 설정했지만 프로그램이 중단되면 오류가 발생하지 않습니다. 무엇이 문제 일 수 있습니까? 파이프 라인을 설정하고 파일의 경로를 설정하기 위해 따라야 할 특정 순서가 있습니까?

답변

2

gstreamer와 함께 제공되는 예제를 살펴보십시오. 몇 가지 포인트 :

  • 당신은 URI
  • 주-변화가 비동기 변경할 수 있도록 다시 준비로 파이프 라인의 상태를 설정해야합니다. The GstBus에 대해 읽고 그것을 사용하십시오. 연주 후 버스에 부착하지 마십시오. 플레이 빈 파이프 라인을 만들고 버스에 연결하십시오. 그런 다음 PLAYING (재생)으로 이동하면 버스에서 재생이 시작된시기와 완료된시기 (다른 것들 중에서)를 알려줍니다.

새 응용 프로그램에 1.0을 사용하고, 유지 관리 모드에 0.10을 사용하는 것도 고려하십시오.

+0

안녕하세요, 어디에서 GStreamer 예제를 찾을 수 있습니까? 감사. –

+0

각 자식 모듈에는 하위 디렉토리 테스트/예제가 있습니다. – ensonic