Gstreamer с Visual C++ Express 2010 - учебное пособие 1

Я новичок в Gstreamer, и у меня возникают проблемы при компиляции учебника 1 по Gstreamer. Я использую 64-разрядную версию Windows 7 с Visual C++ Express 2010 и 32-разрядную версию Gstreamer SDK 2012.11 ( скачано здесь). Вот код:

#include "stdafx.h"
#include <gst/gst.h>

int main(int argc, char *argv[]) {
  GstElement *pipeline;
  GstBus *bus;
  GstMessage *msg;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Build the pipeline */
  pipeline = gst_parse_launch ("playbin2 uri=file://E:/test_1.MOV", NULL);

  /* Start playing */
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* Wait until error or EOS */
  bus = gst_element_get_bus (pipeline);
  msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

  /* Free resources */
  if (msg != NULL)
    gst_message_unref (msg);
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  return 0;
}

Первая ошибка:

error C2664: 'gst_bus_timed_pop_filtered' : cannot convert parameter 3 from 'int' to 'GstMessageType'

Поэтому я просто удалил GST_MESSAGE_ERROR из кода. Итак, линия сейчас:

msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_EOS);

У меня была такая же проблема с Ubuntu. Но после этого в Ubuntu я смог воспроизвести видео.

Вторая ошибка: Но с Windows, компиляция хороша, но когда я пытаюсь ее запустить, у меня появляются следующие ошибки:

GStreamer-CRITICAL **: gst_element_set_state: assertion 'GST_IS_ELEMENT <element>' failed
GStreamer-CRITICAL **: gst_element_get_bus: assertion 'GST_IS_ELEMENT <element>' failed
GStreamer-CRITICAL **: gst_bus_timed_pop_filtered: assertion 'GST_IS_BUS <bus>' failed
GStreamer-CRITICAL **: gst_object_unref: assertion 'object=!NULL' failed
GStreamer-CRITICAL **: gst_element_set_state: assertion 'GST_IS_ELEMENT <element>' failed
GStreamer-CRITICAL **: gst_object_unref: assertion 'object=!NULL' failed

Я не очень понимаю, почему это работает с Ubuntu, а не с Windows. И я действительно не знаю, как решить эту проблему. Не могли бы вы мне помочь, пожалуйста?

С Уважением,

4 ответа

Решение

lпервая ошибка

Вероятно, код скомпилирован как C++, что немного более строго при приведении enum. Попробуйте заменить:GST_MESSAGE_ERROR | GST_MESSAGE_EOS с (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS)

Вторая ошибка

Существует высокая вероятность, что линия:

pipeline = gst_parse_launch ("playbin2 uri=file://E:/test_1.MOV", NULL);

возвращает NULL, а остальные ошибки являются результатом этого. Почему он может вернуть NULL? Есть много причин. Может быть, вы не установили плагин с "playbin2"? Попробуй это:

  • Передать указатель на GError структура как второй параметр gst_parse_launch (оно имеет message поле, которое может дать вам подсказку)
  • Проходить --gst-debug-level=4 или даже выше в качестве параметра командной строки при запуске вашей программы. Вы увидите много информации на выходе консоли, причина сбоя будет где-то там.

Я думаю, что вы используете gstreamer 1.0, если я не ошибаюсь, попробуйте использовать

"playbin" вместо "palybin2"

"playbin2" переименован в "playbin" из gstreamer 1.0

Вторая ошибка:

Я хотел бы объяснить это для пользователей Ubuntu 16.04 LTS.

Чтобы попробовать примеры из разделов учебных пособий GStreamer, вы должны скомпилировать и установить из исходных кодов эти репозитории:

gstreamer
gst-plugins-base
gst-plugins-good

Причина в том, что версии, использованные в примерах, не совпадали с версиями, которые я установил с помощью apt (playbin скучал).

Перед компиляцией из исходного кода вам также понадобятся зависимости для сборки vorbis, vpx а также souphttpsrc плагины (они являются частью упомянутых репозиториев). Вы можете установить их, запустив:

apt install libvorbis-dev libsoup2.4-dev libvpx-dev

Чтобы проверить, были ли упомянутые плагины включены в сборку репозитория, смотрите ./configure выход. Если нет, возможно, в вашей системе все еще отсутствуют некоторые зависимости. Выходные данные скажут вам, чего не хватает.

После этого вы должны успешно скомпилировать и запустить пример (вы должны увидеть воспроизведение видео).

Общий процесс исправления начальных проблем установки с помощью GStreamer (как указано в принятом ответе) использует --gst-debug-level=4, выяснить, какие плагины отсутствуют и установить их.

Для ошибки 1, если вы компилируете с помощью c ++, используйте: gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, static_cast<GstMessageType>(GST_MESSAGE_ERROR | GST_MESSAGE_EOS)); вместо того: gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

Другие вопросы по тегам