Stworzyłem oddzielną klasę dla gstreamer do streamowania filmów.
Ta klasa działa w oddzielnym wątku za pomocą funkcji moveToThread().
Używam Qt5.5 do programowania.
Kiedy uruchamiam polecenie startowe w głównym wątku, Qthread startuje, a gstreamer używa g_main_loop_run
do streamowania filmów. Działa to absolutnie dobrze. Ale jakoś g_main_loop_run
blokuje wątek i kiedy wysyłam sygnał, aby zatrzymać wideo z głównego wątku, nie wykonuje się go w klasie gstreamer.g_main_loop_run blokuje Qthread i nie pozwala zatrzymać wideo
Czy ktoś może mi doradzić, jak rozwiązać ten problem? Albo mogę zastąpić g_main_loop_r
un inną komendą lub może być użyty g_main_loop_quit(gloop)
; innym sposobem.
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.
}
// gdzieś w głównym wątku
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();
Dlaczego nie wystarczy użyć QMediaPlayer zamiast próbować łączyć Qt i Gtk +? – MrEricSir
Niestety, jest to req projektu, aby używać tylko gstreamer-0.10 nz qt. Lol – samprat
Tak nie możesz użyć gstreamer bez g_main_loop_run? – dtech