Я пытаюсь получить rtsp видеокадры, используя GStreamer 1.0 и библиотеки Qt. У меня проблема с получением формы кадров appsink, потому что как-то моя функция обратного вызова не работает.
FrameFlow::FrameFlow()
{
pipeline_ = gst_parse_launch ("rtspsrc location=rtsp://admin:[email protected]:554 ! decodebin ! appsink name=sink", nullptr);
sink_ = gst_bin_get_by_name(GST_BIN(pipeline_), "sink");
gst_app_sink_set_emit_signals(GST_APP_SINK(sink_), TRUE);
g_signal_connect(sink_, "new-sample", G_CALLBACK(newSample(GST_APP_SINK(sink_), (gpointer) this)), (gpointer)this);
gst_element_set_state(pipeline_, GST_STATE_PLAYING);
}
GstFlowReturn FrameFlow::newSample(GstAppSink *sink, gpointer gSelf)
{
GstSample* sample = NULL;
GstMapInfo bufferInfo;
FrameFlow* self = static_cast<FrameFlow* >(gSelf);
sample = gst_app_sink_pull_sample(GST_APP_SINK(sink_));
if(sample != NULL)
{
buffer_ = gst_sample_get_buffer(sample);
if(buffer_ != NULL)
{
gst_buffer_map(buffer_, &bufferInfo, GST_MAP_READ);
self->mutex_.lock();
self->image_ = QImage(bufferInfo.data, 320, 180, QImage::Format_RGB888);
self->mutex_.unlock();
gst_buffer_unmap(buffer_, &bufferInfo);
}
gst_sample_unref(sample);
}
return GST_FLOW_OK;
}
Я пытаюсь зарегистрироваться newSample()
функция как обратный вызов, но когда я отлаживаю эту функцию, она не вызывается ни разу, но память просачивается (думаю, это работает, потому что, когда я комментирую gst_element_set_state(pipeline_, GST_STATE_PLAYING);
больше не протекает)
Где я делаю ошибку?
Спасибо за помощь!
Задача ещё не решена.
Других решений пока нет …