как исправить «GStreamer-CRITICAL **: gst_sample_get_buffer: ошибка утверждения ‘GST_IS_SAMPLE (образец)'»

#c #linux #qt #ubuntu #gstreamer

#c #linux #qt #ubuntu #gstreamer

Вопрос:

Я хотел захватить видеокадр через gstreamer и отобразить в своем приложении (используя Qt), но я столкнулся с некоторой проблемой:

Когда я пытался использовать GstAppSink (gst_app_sink_pull_sample), он продолжал возвращать NULL, чего я не понимаю. Я могу транслировать видео с помощью терминала (gst-launch-1.0) отлично.

Ниже приведен мой код:

 void gstreamer::openStream()
{
    pipeline = gst_parse_launch ("rtspsrc location=rtsp://192.168.10.123 ! rtph264depay ! h264parse ! queue ! avdec_h264 ! xvimagesink sync=false async=false appsink name=mysink", NULL);

    GstElement* sink = gst_bin_get_by_name(GST_BIN(pipeline), "mysink");

    GstAppSink* appsink = GST_APP_SINK(sink);

    if(!appsink)
    {
        qDebug() << "get app sink failed";
    }
    else
    {
        qDebug() << "app sink pass";
        mAppSink = appsink;

        openSample();
    }
}

void gstreamer::openSample()
{

    if(!mAppSink)
    {
        qDebug() << "appsink failed";
    }
    GstSample* gstSample = gst_app_sink_pull_sample(mAppSink);

    if(gstSample == NULL)
    {
        qDebug() << "sample failed ";
    }
    else{
        qDebug() << "sample pass";
    }

    GstBuffer* buffer = gst_sample_get_buffer(gstSample);
    if(!buffer)
    {
        qDebug() << "buffer fail";
    }

    GstMapInfo map;

    gst_buffer_map(buffer, amp;map, GST_MAP_READ);


    QImage image = QImage((map.data), 320, 240, QImage::Format_RGB888);
    emit sendFrame(image);
}
  

Я пытался найти в Интернете, но вряд ли есть какие-либо ссылки на эту проблему.

Комментарии:

1. xvimagesink sync=false async=false appsink name=mysink эта часть не имеет смысла. Вам нужен xvimagesink или appsink. Оба с этим синтаксисом — просто тарабарщина.

2. Привет, я просто хочу appsink, просто тестировал с xvimagesink, чтобы увидеть, в чем разница.

3. Кроме того, вы даже не запускаете конвейер. И вам, вероятно, следует подключаться к обратному вызову всякий раз, когда доступен новый образец. Я предлагаю прочитать некоторые из примеров Gstreamer appsink.

4. Если я установлю gst_element_set_state, то поток выйдет, но я не смогу отобразить его в своем приложении. Моя идея состоит в том, чтобы захватить фрейм и отобразить в моем приложении вместо одного окна отдельно.

5. Это слишком долго, чтобы объяснять здесь. Вы должны посмотреть на GstVideoOverlay примеры. Это позволяет вам делать именно это — отображать видео внутри виджетов вашего собственного приложения вместо его собственного окна.

Ответ №1:

Попробуйте изменить конвейер на «rtspsrc location=rtsp://192.168.10.123! rtph264depay! h264parse ! имя tee=my_tee ! очередь! avdec_h264 ! xvimagesink sync=false my_tee. ! очередь! appsink async = ложное имя = mysink»