2017-09-15 118 views
0

我在Qt中有我的GUI,我有一個Gstreamer管道,它從電視FM卡抓取音頻並將其寫入文件。我在管道中添加了一個level元素,因爲我想使用Qt ProgressBar顯示當前的音頻級別。我只是無法弄清楚如何將GLib contexto的值傳遞給Qt GUI上下文。與Qt和Gstreamer的交互問題

一塊我的代碼,我添加總線手錶(Qt的插槽內)

gst_bin_add_many(GST_BIN(pline2), alsasrc, audioconvert, level, audioresample, wavenc, filesink, NULL); 
gst_element_link_many(alsasrc, audioconvert, level, audioresample, wavenc, filesink, NULL); 
bus = gst_pipeline_get_bus(GST_PIPELINE(pline2)); 
guint watch_id = gst_bus_add_watch (bus, message_handler, NULL); 
gst_bus_add_watch(bus, bus_call, loop2); 
gst_object_unref(bus); 

而這正是我得到的音頻電平

static gboolean message_handler (GstBus * bus, GstMessage * message, gpointer data) 
{ 
    if (message->type == GST_MESSAGE_ELEMENT) { 
     const GstStructure *s = gst_message_get_structure (message); 
     const gchar *name = gst_structure_get_name (s); 
     if (strcmp (name, "level") == 0) { 
      gint channels; 
      GstClockTime endtime; 
      gdouble rms_dB, peak_dB, decay_dB; 
      gdouble rms; 
      const GValue *array_val; 
      const GValue *value; 
      GValueArray *rms_arr, *peak_arr, *decay_arr; 
      gint i; 
      if (!gst_structure_get_clock_time (s, "endtime", &endtime)) 
       g_warning ("Could not parse endtime"); 
      /* the values are packed into GValueArrays with the value per channel */ 
      array_val = gst_structure_get_value (s, "rms"); 
      rms_arr = (GValueArray *) g_value_get_boxed (array_val); 
      array_val = gst_structure_get_value (s, "peak"); 
      peak_arr = (GValueArray *) g_value_get_boxed (array_val); 
      array_val = gst_structure_get_value (s, "decay"); 
      decay_arr = (GValueArray *) g_value_get_boxed (array_val); 
      /* we can get the number of channels as the length of any of the value 
        * arrays */ 
      channels = rms_arr->n_values; 
      g_print ("endtime: %" GST_TIME_FORMAT ", channels: %d\n", 
         GST_TIME_ARGS (endtime), channels); 
      for (i = 0; i < channels; ++i) { 
       g_print ("channel %d\n", i); 
       value = g_value_array_get_nth (rms_arr, i); 
       rms_dB = g_value_get_double (value); 
       value = g_value_array_get_nth (peak_arr, i); 
       peak_dB = g_value_get_double (value); 
       value = g_value_array_get_nth (decay_arr, i); 
       decay_dB = g_value_get_double (value); 
       //g_print (" RMS: %f dB, peak: %f dB, decay: %f dB\n", rms_dB, peak_dB, decay_dB); 
       /* converting from dB to normal gives us a value between 0.0 and 1.0 */ 
       rms = pow (10, rms_dB/20); 
       //g_print (" normalized rms value: %f\n", rms); 


      } 
     } 
    } 
    return TRUE; 
} 

我怎麼能顯示,對於例如,rms_dB值?也許有人可以給我一個提示。謝謝。

回答

1

您可以通過進度條指針作爲參數傳遞給gst_bus_add_watch:

QProgressBar* progressBar = ...; 
... 
guint watch_id = gst_bus_add_watch (bus, message_handler, (gpointer)progressBar); 
... 
static gboolean message_handler (GstBus * bus, GstMessage * message, gpointer data) 
{ 
    ... 
    QProgressBar* progressBar = static_cast<QProgressBar*>(data); 
    progressBar->setValue(rms_dB); 
    ... 
} 
+0

這是我所得到的:錯誤:調用沒有匹配的函數「qobject_cast(無效*)」 QProgressBar *進度= qobject_cast (數據); – alexanderk409

+0

QProgressBar * progressBar = static_cast (data);,因爲不是QObject指針qobject_cast不能工作。 –

+0

非常感謝。輝煌的解決方案。有用。 – alexanderk409