Ho creato una classe separata per gstreamer per lo streaming di video.
Questa classe viene eseguita su thread separato utilizzando moveToThread().
Sto usando Qt5.5 per lo sviluppo.
Quando si esegue startcommand su thread principale, Qthread si avvia e gstreamer utilizza g_main_loop_run
per lo streaming di video. Questo funziona assolutamente bene. Ma in qualche modo g_main_loop_run
blocca il thread e quando invio il segnale per fermare il video dal thread principale, non esegue lo slot nella classe gstreamer.g_main_loop_run blocca il Qthread e non consente di arrestare il video
Qualcuno può consigliarmi come risolvere il problema? O posso sostituire g_main_loop_r
un con qualche altro comando o può essere utilizzato g_main_loop_quit(gloop)
; in un altro modo.
void StreamingVideo::slotStartStream() // this slot called on start of thread from main thread
{
if(!isElementsLinked())
{
qDebug() << " we are emitting in dummy server ";
//emit sigFailed("elementsFailed"); // WILL CONNECT IT WITH MAIN GUI ONXCE CODE IS FINISHED
return;
}
gst_bus_add_watch(bus, busCall, gloop);
gst_object_unref(bus);
//proper adding to pipe
gst_bin_add_many(GST_BIN(pipeline), source, capsFilter, conv, videoRate, capsFilterRate,
clockDisplay, videoEnc, udpSink, NULL
);
//proper linking:
gst_element_link_many(source, capsFilter, conv, videoRate, capsFilterRate, clockDisplay, videoEnc, udpSink, NULL);
g_print("Linked all the Elements together\n");
gst_element_set_state(pipeline, GST_STATE_PLAYING);
// Iterate
g_print ("Running...\n");
emit sigStartStream(); // signal to main thread to issue success command . works fine
g_main_loop_run(gloop);
g_print ("Returned, stopping playback\n");
//gst_element_set_state (pipeline, GST_STATE_NULL);
if(g_main_loop_is_running(gloop))
{
qDebug() << " in g_main_loop_is_runnung emiting signal ";
emit sigStartStream();
}
if(!g_main_loop_is_running(gloop))
{
qDebug() << "in not gmain running thread id";
qDebug() << QThread::currentThreadId();
}
}
void StreamingVideo::slotStopStream() // THIS SLOT IS NOT CALLED WHEN VIDEO RUNNING
{
qDebug() << " we are planning to stop streaming stramingVideo::slotStopStream ";
g_print ("Returned, stopping playback\n");
g_main_loop_quit(gloop);
gst_element_set_state (pipeline, GST_STATE_NULL);
// g_main_loop_quit(gloop);
releaseMemory();
emit sigStopStream(); // signal to main thread to issue message saying video has stopped.
}
// da qualche parte nel thread principale
threadStreaming = new QThread();
streamVideo = new StreamingVideo("127.0.0.1"); // we will automate this ip address later on
streamVideo->moveToThread(threadStreaming);
connect(threadStreaming, SIGNAL(started()), streamVideo, SLOT(slotStartStream()));
connect(streamVideo, SIGNAL(sigStopStream()), threadStreaming, SLOT(quit()));
connect(streamVideo, SIGNAL(sigStopStream()), streamVideo, SLOT(deleteLater()));
connect(threadStreaming, SIGNAL(finished()), threadStreaming, SLOT(deleteLater()));
connect(streamVideo, SIGNAL(sigStartStream()), this, SLOT(slotTrueStreamRun() ));
connect(streamVideo, SIGNAL(sigStopStream()), this, SLOT(slotFalseStreamRun()));
connect(this, SIGNAL(sigMopsCamStopCmd()), streamVideo, SLOT(slotStopStream()));
threadStreaming->start();
perché non utilizzare QMediaPlayer invece di provare a mettere insieme Qt e Gtk +? – MrEricSir
Sfortunatamente, il req del progetto utilizza solo gstreamer-0.10 n con qt. Lol – samprat
Quindi non puoi usare gstreamer senza g_main_loop_run? – dtech