Я запускаю GStreamer exsample: qglwtextureshare. Но я обнаружил, что он рухнет в
qglrenderer.cpp Line168 Q_ASSERT (gst_is_gl_memory (mem)); Я модифицировал конвейер следующим образом:
m_pipeline =
GST_PIPELINE (gst_parse_launch
("videotestsrc ! "
"video/x-raw, width=640, height=480, "
"framerate=(fraction)30/1 ! "
"fakesink sync=1", NULL));
, потому что gleffects effect = 5 выдает ошибку, не удается получить шейдер рыбий глаз.
А в остальном я не меняю. Я не знаю, почему он не может получить данные кадра. Пожалуйста, помогите мне, спасибо.
Спасибо за ответ. Я хочу получить каждый кадр из видео. Поэтому я использую fakesink, и в его функции обратного вызова я получаю буфер, а затем отправляю его в QT QOpenGLWidget, чтобы показать его. Моя старая идея - использовать appink, но она очень медленная, тогда я нашел этот способ.
appsink
- это то, что вам нужно. Если вы делаете это вручную, нет более быстрого способа. Возможно, вы захотите использовать обычный сток и интерфейс GtVideoOverlay
, который, вероятно, быстрее. Существуют приемники-приемники Qt для встраивания в приложения Qt именно для этой цели.
Что такое GtVideoOverlay? Не могли бы вы рассказать поподробнее? QT очень недружелюбен, он несовместим между каждой версией. По этой причине мы используем GStreamer, а не класс QtGStreamer.
Проверьте документы, так как gstreamer.freedesktop.org/data/doc/gstreamer/head/… большинство приемников видео реализуют этот интерфейс. Затем вы можете передать поверхность для рисования раковине, и она отобразит видео на этой поверхности.
Спасибо. Я перешел на твой путь.
Чего вы здесь ждете?
fakesink
- это фиктивный приемник, который существует для того, чтобы иметь приемник, но все, что он делает, это отбрасывает данные ..