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);