Я пытался использовать фонон для воспроизведения видео, но не смог. Офф-поздно стало известно на форумах Qt, что даже последняя версия Qt не поддерживает фононы. Именно тогда я начал использовать Gstreamer. Есть предложения, как связать окно Gstreamer с виджетом Qt? Моя цель - воспроизвести видео с помощью Gstreamer в виджете Qt. Так как мне связать окно Gstreamer и виджет Qt?
Мне удалось получить Id
виджета через winid()
.
Далее с помощью Григория Пакоша я добавил следующие 2 строки кода в свое приложение -
QApplication::syncX();
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(sink), widget->winId());
Однако я не могу связать виджет Qt с видеоокном gstreamer.
Вот как будет выглядеть мой пример кода: -
int main(int argc, char *argv[])
{
printf("winid=%d\n", w.winId());
gst_init (NULL,NULL);
/* create a new bin to hold the elements */
bin = gst_pipeline_new ("pipeline");
/* create a disk reader */
filesrc = gst_element_factory_make ("filesrc", "disk_source");
g_assert (filesrc);
g_object_set (G_OBJECT (filesrc), "location", "PATH_TO_THE_EXECUTABLE", NULL);
demux = gst_element_factory_make ("mpegtsdemux", "demuxer");
if (!demux) {
g_print ("could not find plugin \"mpegtsmux\"");
return -1;
}
vdecoder = gst_element_factory_make ("mpeg2dec", "decode");
if (!vdecoder) {
g_print ("could not find plugin \"mpeg2dec\"");
return -1;
}
videosink = gst_element_factory_make ("xvimagesink", "play_video");
g_assert (videosink);
/* add objects to the main pipeline */
gst_bin_add_many (GST_BIN (bin), filesrc, demux, vdecoder, videosink, NULL);
/* link the elements */
gst_element_link_many (filesrc, demux, vdecoder, videosink, NULL);
gst_element_set_state(videosink, GST_STATE_READY);
QApplication::syncX();
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(videosink), w.winId());
/* start playing */
gst_element_set_state (bin, GST_STATE_PLAYING);
}
Не могли бы вы подробнее объяснить использование gst_x_overlay_set_xwindow_id () в моем контексте?
Могу ли я получить какой-нибудь намек на то, как я могу интегрировать gstreamer в Qt?
Пожалуйста, помогите мне решить эту проблему.