Получить кадры из потока RTSP с помощью GStreamer 1.0 в C ++ - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь получить rtsp видеокадры, используя GStreamer 1.0 и библиотеки Qt.У меня проблема с получением кадров из appsink , потому что моя функция обратного вызова почему-то не работает.

FrameFlow::FrameFlow()
{
    pipeline_ = gst_parse_launch ("rtspsrc location=rtsp://admin:rce@192.168.88.240: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);, он больше не течет).

Где я делаю ошибку?

Спасибо за вашу помощь!

...