2011-03-15 8 views
6

में धकेल छवियों, कुछ खिलौना अनुप्रयोगों के साथ प्रयोग करना प्रलेखन खोज और आसपास googling मैं अभी भी क्या मुझे लगता है कि होगा एक नहीं बल्कि आम उपयोग मामला है के लिए हैरान हूँ (मेलिंग सूची अभिलेखागार सहित) के बाद।एक gstreamer पाइपलाइन

मेरे पास एक मौजूदा कोड है जो छवियों (स्मृति में) उत्पन्न करता है और मैं इन छवियों को एक जीस्ट्रीमर पाइपलाइन में धक्का देना चाहता हूं (अंत में एक FLV वीडियो बनाने के लिए)।

मुझे "ऐसा करने का स्पष्ट तरीका" नहीं मिला। मेरा सबसे अच्छा अनुमान GSTMultiFileSrc और इसके माता-पिता GstPushSrc के स्रोत कोड में खोदना होगा, इसे समझने के लिए।

क्या आप में से कोई भी ऐसा करने के "स्पष्ट तरीके" को इंगित कर सकता है? क्या यह इस पर दस्तावेज़ीकरण/ट्यूटोरियल/उदाहरण का कोई संबंधित टुकड़ा है?

एक बार मेरे पास इनपुट सही होने के बाद, शेष केक का एक टुकड़ा है, धन्यवाद Gstreamer उत्कृष्टता! (की तरह कुछ "मेरे जादू इनपुट -> ffmpegcolorspace ffenc_flv flvmux filesink स्थान = desktop.flv!!")

अपने जवाब के लिए धन्यवाद।

उत्तर

7

जीस्ट्रीमर प्लगइन का उपयोग सबकुछ करने के लिए करता है। प्लगइन्स जो डेटा बनाते हैं या इसे बाहरी स्रोत से लेते हैं उन्हें "src" plugins कहा जाता है।

एक पाइपलाइन में एप्लिकेशन द्वारा जेनरेट किए गए डेटा इंजेक्शन के लिए सामान्य स्रोत प्लगइन को appsrc कहा जाता है। एपीआरआरसी द्वारा प्रदान की गई एपीआई को App Library के हिस्से के रूप में दस्तावेज किया गया है।

यहां एक उदाहरण है जो जेनरेट की गई छवियों के साथ ऐप्सआरसी खिला रहा है: gdk-gstappsrc-stream.c। ऐसा लगता है कि जीस्ट्रीमर स्रोत पेड़ में कुछ टेस्ट कोड से लिया गया है: here

एक और तरीका आपकी खुद की src प्लगइन बनाना होगा। goom संगीत विज़ुअलाइजेशन प्लगइन को एक उदाहरण के लिए देखें जो आपके द्वारा निर्दिष्ट किए गए समान तरीके से काम करता है।

+0

धन्यवाद! GstAppSrc वही है जो मैं खोज रहा था। – rodrigob

1

आप जो चाहते हैं उसे करने के लिए आप imagefreeze हैकिंग करने का प्रयास कर सकते हैं। appsrc यह भी कर सकता है।

2

मुझे इस पर एक समाधान (शायद) मिला (मुझे ओपनसीवी के साथ छवियां मिलती हैं) ... लेकिन मुझे पाइपलाइन के साथ एक त्रुटि है: तत्व mysource से त्रुटि: त्रुटि en el flujo de datos interno। डिबगिंग जानकारी: gstbasesrc.c (2574): gst_base_src_loop():/GstPipeline: pipeline0/GstAppSrc: mysource: स्ट्रीमिंग कार्य रुका हुआ है, कारण नहीं-बातचीत के जरिए (-4)

इस कोड है:

typedef struct _App App; 
struct _App{ 
    GstElement *pipeline; 
    GstElement *appsrc; 

    GMainLoop *loop; 
    guint sourceid; 
    GTimer *timer; 
}; 

App s_app; 
CvCapture *capture; 
static gboolean read_data(App *app){ 
    GstFlowReturn ret; 
    GstBuffer *buffer = gst_buffer_new(); 
    IplImage* frame = cvQueryFrame(capture); 
    GST_BUFFER_DATA(buffer) = (uchar*)frame->imageData; 
    GST_BUFFER_SIZE(buffer) = frame->width*frame->height*sizeof(uchar*); 
    g_signal_emit_by_name(app->appsrc,"push-buffer",buffer,&ret); 
    gst_buffer_unref(buffer); 
    if(ret != GST_FLOW_OK){ 
     GST_DEBUG("Error al alimentar buffer"); 
     return FALSE; 
    } 
    return TRUE; 
} 

static void start_feed(GstElement* pipeline,guint size, App* app){ 
    if(app->sourceid == 0){ 
     GST_DEBUG("Alimentando"); 
     app->sourceid = g_idle_add((GSourceFunc) read_data, app); 
    } 
} 

static void stop_feed(GstElement* pipeline, App* app){ 
    if(app->sourceid !=0){ 
     GST_DEBUG("Stop feeding"); 
     g_source_remove(app->sourceid); 
     app->sourceid = 0; 
    } 
} 

static gboolean 
bus_message (GstBus * bus, GstMessage * message, App * app) 
{ 
    GST_DEBUG ("got message %s", 
    gst_message_type_get_name (GST_MESSAGE_TYPE (message))); 

    switch (GST_MESSAGE_TYPE (message)) { 
    case GST_MESSAGE_ERROR: { 
     GError *err = NULL; 
     gchar *dbg_info = NULL; 
     gst_message_parse_error (message, &err, &dbg_info); 
     g_printerr ("ERROR from element %s: %s\n", 
      GST_OBJECT_NAME (message->src), err->message); 
     g_printerr ("Debugging info: %s\n", (dbg_info) ? dbg_info : "none"); 
     g_error_free (err); 
     g_free (dbg_info); 
     g_main_loop_quit (app->loop); 
     break; 
    } 
    case GST_MESSAGE_EOS: 
     g_main_loop_quit (app->loop); 
     break; 
    default: 
     break; 
    } 
    return TRUE; 
} 

int main(int argc, char* argv[]){ 
    App *app = &s_app; 
    GError *error = NULL; 
    GstBus *bus; 
    GstCaps *caps; 
    capture = cvCaptureFromCAM(0); 
    gst_init(&argc,&argv); 
    /* create a mainloop to get messages and to handle the idle handler that will 
    * feed data to appsrc. */ 
    app->loop = g_main_loop_new (NULL, TRUE); 
    app->timer = g_timer_new(); 

    app->pipeline = gst_parse_launch("appsrc name=mysource ! video/x-raw-rgb,width=640,height=480,bpp=24,depth=24 ! ffmpegcolorspace ! videoscale method=1 ! theoraenc bitrate=150 ! tcpserversink host=127.0.0.1 port=5000", NULL); 
    g_assert (app->pipeline); 
    bus = gst_pipeline_get_bus (GST_PIPELINE (app->pipeline)); 
    g_assert(bus); 
    /* add watch for messages */ 
    gst_bus_add_watch (bus, (GstBusFunc) bus_message, app); 
    /* get the appsrc */ 
    app->appsrc = gst_bin_get_by_name (GST_BIN(app->pipeline), "mysource"); 
    g_assert(app->appsrc); 
    g_assert(GST_IS_APP_SRC(app->appsrc)); 
    g_signal_connect (app->appsrc, "need-data", G_CALLBACK (start_feed), app); 
    g_signal_connect (app->appsrc, "enough-data", G_CALLBACK (stop_feed), app); 

    /* set the caps on the source */ 
    caps = gst_caps_new_simple ("video/x-raw-rgb", 
    "bpp",G_TYPE_INT,24, 
    "depth",G_TYPE_INT,24, 
    "width", G_TYPE_INT, 640, 
    "height", G_TYPE_INT, 480, 
    NULL); 
    gst_app_src_set_caps(GST_APP_SRC(app->appsrc), caps); 
    /* go to playing and wait in a mainloop. */ 
    gst_element_set_state (app->pipeline, GST_STATE_PLAYING); 

    /* this mainloop is stopped when we receive an error or EOS */ 
    g_main_loop_run (app->loop); 
    GST_DEBUG ("stopping"); 
    gst_element_set_state (app->pipeline, GST_STATE_NULL); 
    gst_object_unref (bus); 
    g_main_loop_unref (app->loop); 
    cvReleaseCapture(&capture); 
return 0; 
} 

कोई विचार ???

+0

इसे एक अलग प्रश्न के रूप में पोस्ट करने का प्रयास करें, उत्तर के रूप में नहीं –

संबंधित मुद्दे