2012-02-03 28 views
3

私は以下の基本的なパイプラインを試しています。キャップ機能なしでパイプラインを実行すると、それはまっすぐに通過します(同じI/Oフォーマットを仮定します)。一度キャップを追加すると、プレロールが始まりますが、ビデオはシンク出力まで続きません。gstreamerのキャップがパイプラインをブロックする理由

これは間違っていますか?あなたがcapsfilterが必要なのですかどのような理由から

THX アート

#include <gst/gst.h> 
#include <glib.h> 



static void 
on_pad_added (GstElement *element, 
       GstPad  *pad, 
       gpointer data) 
{ 
    GstPad *sinkpad; 
    GstElement *decoder = (GstElement *) data; 

g_print ("Dynamic pad created, linking out/in \n"); 

    sinkpad = gst_element_get_static_pad (decoder, "sink"); 

    gst_pad_link (pad, sinkpad); 

    gst_object_unref (sinkpad); 
} 

int 
main (int argc, 
     char *argv[]) 
{ 
    GMainLoop *loop; 

    gboolean link_ok; 

    GstElement *pipeline, *source, *decoder, *ffcs, *vidsc, *capsfout, *sink; 
    GstBus *bus; 
    GstCaps *caps; 


    /* Initialisation */ 
    gst_init (&argc, &argv); 

    loop = g_main_loop_new (NULL, FALSE); 

    /* Create gstreamer elements */ 
    pipeline = gst_pipeline_new ("video-player"); 
    source = gst_element_factory_make ("filesrc",   "file-source"); 
    decoder = gst_element_factory_make ("decodebin2",  "dec-bin2"); 
    ffcs  = gst_element_factory_make ("ffmpegcolorspace", "ffcs"); 
    vidsc = gst_element_factory_make ("videoscale",  "vidsc"); 
    capsfout = gst_element_factory_make ("capsfilter",  "capsfout"); 
    sink  = gst_element_factory_make ("filesink",   "vidout"); 

    if (!pipeline || !source || !decoder || !ffcs || !vidsc || !capsfout || !sink) { 
    g_printerr ("One element could not be created. Exiting.\n"); 
    return -1; 
    } 

    /* we set the input/output filename to the source element */ 
    g_object_set (G_OBJECT (source), "location", argv[1], NULL); 
    g_object_set (G_OBJECT (sink), "location", argv[2], NULL); 

    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); 

    gst_bin_add_many (GST_BIN (pipeline), 
        source, decoder, ffcs, vidsc, capsfout, sink, NULL); 


    /* we link the elements together */ 
    gst_element_link (source, decoder); 
    gst_element_link (decoder, ffcs); 
    gst_element_link (ffcs, vidsc); 

    caps = gst_caps_new_simple("video/x-raw-yuv", 
         "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), 
         "width", G_TYPE_INT, 384, 
         "height", G_TYPE_INT, 216, 
         "framerate", GST_TYPE_FRACTION, 25, 1, 
         NULL); 

    link_ok = gst_element_link_filtered(vidsc,sink,caps); 
    gst_caps_unref (caps); 

    if (!link_ok) { 
     g_warning ("Failed to link vidsc to sink!"); 
    }else{ 
     g_print("seems ok, no error reported?\n"); 
    } 


    /* Set the pipeline to "playing" state*/ 
    g_print ("Now playing: %s\n", argv[1]); 
    gst_element_set_state (pipeline, GST_STATE_PLAYING); 


    /* Iterate */ 
    g_print ("Running...\n"); 
    g_main_loop_run (loop); 


    /* Out of the main loop, clean up nicely */ 
    g_print ("Returned, stopping playback\n"); 
    gst_element_set_state (pipeline, GST_STATE_NULL); 

    g_print ("Deleting pipeline\n"); 
    gst_object_unref (GST_OBJECT (pipeline)); 

    return 0; 
} 

答えて

1

?必要なプロパティのみを制限します。例えば。あなたはフレームレートを設定しますが、カプスフィルタの前にビデオ要素はありません。あなたがフレームレートを気にしない場合(例えば、サイズを強制したい場合)、capsfilterで設定したキャップからフレームレートを削除してください。

3

ダイナミックパッドリンクを忘れているかもしれませんいくつかの要素の間であなたはon_pad_added関数を呼び出すことはありません。私も同じ問題がありました。

それ以来追加しようとしましたか?たとえば、この行では、gst_element_linkの代わりに2つの要素を動的にリンクします。

g_signal_connect (decoder, "pad-added", G_CALLBACK (on_pad_added), ffcs); 
関連する問題