2011-11-04 15 views
6

Tôi đang cố gắng sử dụng GStreamer để phát video MP4 từ một tệp. Tôi đã cố gắng để chơi các tập tin sử dụng playbin2 và từ dấu nhắc lệnh sử dụng:GStreamer: cách kết nối các miếng đệm động

gst-launch filesrc location=bbb.mp4 ! decodebin2 ! autovideosink 

Tôi hy vọng trong tương lai mà tôi sẽ cần phải tạo đường ống phức tạp hơn và do đó tại sao tôi đang cố gắng để 'chương trình' các đường ống. Trong chương trình của tôi, tôi đang cố gắng để nhân rộng các đường ống ở trên, tuy nhiên tôi có một vấn đề mà tôi nghi ngờ có liên quan đến kết nối các nguồn năng động hoặc "đôi khi" nguồn gốc của decodebin2 để chìm autovideo. Tôi chỉ sử dụng những yếu tố này để giữ mọi thứ càng đơn giản càng tốt.

static void on_new_decoded_pad(GstElement* object, 
          GstPad* arg0, 
          gboolean arg1, 
          gpointer user_data) 
{ 
    // dynamically connect decoderbin2 src pad to autovideosink sink pad 
} 

static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data) 
{ 
    // handle bus messages 
} 

int main(int argc, char *argv[]) 
{ 
    GMainLoop *loop; 
    GstElement *pipeline, *source, *decodebin, *videosink; 
    GstBus *bus; 

    gst_init (&argc, &argv); 
    loop = g_main_loop_new (NULL, FALSE); 

    pipeline = gst_pipeline_new ("pipeline"); 
    source = gst_element_factory_make("filesrc",  "source"); 
    decodebin = gst_element_factory_make("decodebin2", "decodebin"); 
    videosink = gst_element_factory_make("autovideosink", "videosink"); 

    /* check elements were created successfully */ 
    if (!pipeline || !source || !decodebin || !videosink) { 
     // Failed to create element. Exit Program 
     return -1; 
    } 

    /* apply properties to elements before adding to pipeline */ 
    gchar * filename = "bbb.mp4"; 
    g_object_set(G_OBJECT(source), "location", filename, NULL); 

    /* add a message handler */ 
    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); 
    gst_bus_add_watch (bus, bus_call, loop); 
    gst_object_unref (bus); 

    /* add elements to pipeline (and bin if necessary) before linking them */ 
    gst_bin_add_many(GST_BIN (pipeline), 
        source, 
        decodebin, 
        videosink, 
        NULL); 

    gst_element_link_pads(source, "src", decodebin, "sink"); 

    /* decodebins src pad is a sometimes pad - it gets created dynamically */ 
    g_signal_connect(decodebin, "new-decoded-pad", G_CALLBACK(on_new_decoded_pad), videosink); 

    /* run pipeline */ 
    gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_PLAYING); 

    g_main_loop_run(loop); 

    gst_element_set_state(GST_ELEMENT(pipeline), GST_STATE_NULL); 
    gst_object_unref (pipeline); 

    return 0; 
} 

Những gì tôi mong đợi xảy ra khi tôi chạy chương trình này, là cho on_new_decoded_pad để gọi thông qua một cuộc gọi trở lại chức năng, được thiết lập trong dòng:

g_signal_connect(decodebin, "new-decoded-pad", G_CALLBACK(on_new_decoded_pad), videosink); 

và sẽ cho phép tôi kết nối các miếng đệm một cách thích hợp. Nhưng nó không bao giờ được gọi. Trong thực tế, chương trình dường như đi qua hoàn toàn và sau đó chỉ cần thoát ra (vòng lặp chính không có gì).

Tôi thực sự đánh giá cao nếu ai đó có thể chỉ ra những gì tôi đã làm sai liên quan đến việc gọi lại hoặc giải thích những gì cần phải được thực hiện để ví dụ này để chơi mp4 bằng cách sử dụng các yếu tố được cung cấp.

Trân trọng.

Trả lời

3

Xem điện thoại rtp tôi ví dụ [here]. Rtpbin được sử dụng ở đó. Hi vọng điêu nay co ich.

+0

obalex, cảm ơn bạn đã phản hồi ngay cả khi nó hơi muộn (tôi có thể thực sự đã thực hiện với điều này 6 tháng trước: P) Tuy nhiên, tôi đã xem nhanh mã của bạn và có vẻ khá được viết. Tôi nghĩ rằng nó sẽ hữu ích cho những người khác vì vậy +1. – user975326