2016-11-07 10 views
8

मेरे पास एक क्यूटी एप्लीकेशन है जो एक अलग धागे में जीस्ट्रीमर से संबंधित सामान करता है। हालांकि मैं सोचता हूं मैंने सिग्नल कॉलबैक सेट करने के नियमों का पालन किया है, मैंने जो कॉलबैक फ़ंक्शन निर्दिष्ट किया है उसे प्रतीत नहीं किया जा रहा है।जीस्ट्रीमर मेरे कॉलबैक को कॉल नहीं कर रहा है

कॉलबैक फ़ंक्शन इस प्रकार है, सब यह करने के लिए प्रयास करता है डिबगिंग के लिए सांत्वना के लिए कुछ लोग इन है:

static gboolean Cb(GstBus *bus, GstMessage *msg, gpointer data) 
{ 
    std::cout << "g_sig, bus = " << (void*)bus 
       << ", msg = "  << (void*)msg 
       << ", data = "  << (void*)data 
       << std::endl; 
    return TRUE; 
} 

अनुक्रम मैं शुरू करने और धारा (एक जीवित RTSP/264 फ़ीड की निगरानी के लिए उपयोग कर रहा हूँ एक आईपी कैमरे से) है:

GstElement *playBin = gst_parse_launch("<gstreamer pipeline>"); 
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(playBin)); 
gst_bus_add_signal_watch(bus); 
g_signal_connect(bus, "message::state-changed", (GCallback)Cb, NULL); 
gst_element_set_state(playBin, GST_STATE_PLAYING); 

GMainLoop *mainLoop = g_main_loop_new(NULL, FALSE); 
g_main_loop_run(mainLoop); 

अब धारा वास्तव में खेल रहा है (वीडियो दिखाई देता है) तो मैं वहां कोई नहीं मुद्दा है यह सोचते कर रहा हूँ है। हालांकि, मुझे उम्मीद है कि पाइपलाइन शुरू होने पर स्थिति परिवर्तन संदेश पोस्ट किया जाना चाहिए। यह तब नहीं हो रहा है जब से मैं Cb() से आउटपुट नहीं देख रहा हूं।

मुझे message::eos, message::error और message::element संकेतों को भी पकड़ने पर भी मुझे कोई आउटपुट नहीं मिलता है।

मुझे यकीन नहीं है कि यह एक समस्या होगी, लेकिन बस, उपरोक्त कोड थोड़ा सरलीकृत है। वास्तव में दो स्ट्रीम चल रहे हैं, इसलिए प्रत्येक प्लेबिन के लिए उपरोक्त कोड का पहला स्निपेट दो बार होता है (अनुक्रम प्रत्येक के लिए सटीक है, मुझे कोड को अनावश्यक रूप से जटिल करने की आवश्यकता नहीं है)।

फिर मुख्य पाश बनाया और चलाया जाता है।

जैसा कि कहा गया है, मुझे कॉलबैक फ़ंक्शन से कोई आउटपुट नहीं दिख रहा है, तो मेरे संदेश कहां जा रहे हैं?

परिशिष्ट: क्या इसके लायक है, मैं भी कोशिश की है के लिए gst_bus_add_watch विधि सभी बजाय संदेशों विशिष्ट संकेत है, लेकिन अभी भी कुछ नहीं दिखाई देता है पर कब्जा करने की। मुझे यह भी उल्लेख करना चाहिए कि, एक क्यूटी अनुप्रयोग होने के नाते, मेरे पास कोड में gtk_init नहीं है - मैं मुख्य धागे से gst_init पर कॉल करता हूं।

+1

मुझे लगता है कि आप वास्तविक कोड में सभी बुलाए गए कार्यों (विशेष रूप से g_signal_connect) के वापसी मूल्यों की जांच कर रहे हैं? – Silicomancer

+0

किसी कारण से यह संभव है कि स्टडआउट को रीडायरेक्ट किया जा रहा है। क्या आपने 'सीबी() 'फ़ंक्शन में ब्रेकपॉइंट में रखने का प्रयास किया है? – MrEricSir

उत्तर

1

जीस्ट्रीमर का मेरा ज्ञान सीमित है, मैंने बहुत समय पहले इसके साथ गड़बड़ कर दी थी।

मैं एक छोटे से परीक्षण किया जाता है, और यह काम करने लगता है:

#include <stdio.h> 
#include <gstreamer-1.0/gst/gst.h> 

static gboolean Cb(GstBus *bus, GstMessage *msg, gpointer data) 
{ 
     printf("g_sig, bus = %x, msg = %s, data = %x\n", 
      bus, 
      gst_message_type_get_name(GST_MESSAGE_TYPE(msg)), 
      data); 

     return TRUE; 
} 

int main(int argc, char *argv[]) { 
     GstElement *pipeline; 
     GstBus *bus; 
     GstMessage *msg; 

     /* Initialize GStreamer */ 
     gst_init (&argc, &argv); 

     /* Build the pipeline */ 
     pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL); 

     /* Wait until error or EOS */ 
     bus = gst_element_get_bus (pipeline); 

     /* use the sync signal handler to link elements while the pipeline is still 
     * doing the state change */ 
     gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, pipeline, NULL); 
     g_object_connect (bus, "signal::sync-message::state-changed", G_CALLBACK (Cb), pipeline, NULL); 

     /* Start playing */ 
     gst_element_set_state (pipeline, GST_STATE_PLAYING); 

     msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS); 

     /* Free resources */ 
     if (msg != NULL) 
       gst_message_unref (msg); 

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

     return 0; 
} 

लेकिन जब message::state-changed:

एक संदेश बस में नियुक्त किया गया है। यह संकेत जीएसओएस से मुख्यलोप में जोड़ा गया है। यह संकेत केवल उत्सर्जित होगा जब एक मेनलोप चल रहा है।

बजाय signal::sync-message::state-changed:

एक संदेश बस में नियुक्त किया गया है। यह संकेत थ्रेड से उत्सर्जित किया गया है जिसने संदेश पोस्ट किया है ताकि किसी को लॉकिंग से सावधान रहना पड़े।

तो सिंक-संदेश मुख्यलोप के बाहर भी उत्सर्जित होता है।

दोनों संकेतों के लिए docs

+0

मुझे यकीन नहीं है कि इस उत्तर ने ओपी की मदद की है, लेकिन अन्यथा कोई टिप्पणी नहीं दी गई है, इसलिए मैं आपके उत्तर में बक्षीस दे रहा हूं। आपके महान प्रयास के लिए धन्यवाद। – user2728397

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