Чуть больше года назад пользователь POPSuL опубликовал серию статей (1, 2 и 3) о мультимедийном фреймворке GStreamer (за что ему огромное спасибо). Я бы хотел продолжить его начинание, сделав больший упор на кодовую составляющую, нежели на инструменты командной строки, входящие в состав GStreamer.
В данной статье я расскажу о самой первой операции при работе с фреймворком — инициализации. А в качестве закрепления материала мы напечатаем версию GStreamer.
Среда разработки
Пример из статьи выполнен в Ubuntu 14.04 c установленным GStreamer версии 1.2.4. Компиляция выполняется следующим образом:
$ gcc -Wall -o source source.c $(pkg-config --cflags --libs gstreamer-1.0)
Также в исходном файле должен быть подключен заголовочный файл:
#include <gst/gst.h>
Инициализация
Перед использованием библиотек GStreamer их нужно инициализировать. Для этого существуют две функции:
void gst_init (int *argc, char **argv[])
gboolean gst_init_check (int *argc, char **argv[], GError **err)
Обе они подготавливают внутреннюю структуру библиотек к использованию и подгружают стандартные плагины. Разница лишь в том, что при невозможности инициализации gst_init() прервет выполнение вашей программы, а gst_init_check() вернет FALSE и отправит отчет в структуру GError.
Деинициализация
Вообще процесс деинициализации (т.е. освобождения ресурсов) происходит автоматически, когда программа завершает свою работу. Однако нелишним будет знать, что можно сделать это и вручную, с помощью функции:
void gst_deinit (void)
Это может понадобиться при отладке приложения, например для поиска утечек.
Важно! После деинициализации никаких обращений к библиотеке GStreamer быть не должно (кроме, разумеется, повторной инициализации).
Практика
Для закрепления теоретического материала напишем приложение, которое выводит версию библиотеки GStreamer. В данном контексте существует два понятия версии:
- версия GStreamer, с которой приложение слинковано в данный момент (runtime-версия)
- версия GStreamer, использованного при компиляции приложения (compile-time-версия)
Для первого варианта используются функции:
void gst_version (guint *major, guint *minor, guint *micro, guint *nano)
gchar * gst_version_string (void)
Для второго варианта используются следующие макросы:
GST_VERSION_MAJOR
GST_VERSION_MINOR
GST_VERSION_MICRO
GST_VERSION_NANO
Насчет nano: 0 — это релизы, 1 — GIT-версии, 2 -… — пререлизы.
Все вышесказанное сведено в следующий пример:
#include <gst/gst.h>
int main (int argc, char * argv[])
{
const gchar *nano;
guint major, minor, micro, nano_int;
/* Инициализация GStreamer, игнорируя любые аргументы */
gst_init (NULL, NULL);
if (gst_is_initialized())
g_print ("GStreamer library successfully initializedn");
/* Выводим версию при компиляции */
if (GST_VERSION_NANO == 0)
nano = "";
else if (GST_VERSION_NANO == 1)
nano = "(GIT)";
else
nano = "(Prerelease)";
g_print ("Compile time version: %d.%d.%d %sn", GST_VERSION_MAJOR, GST_VERSION_MINOR, GST_VERSION_MICRO, nano);
/* Выводим runtime-версию */
gst_version (&major, &minor, &micro, &nano_int);
if (nano_int == 0)
nano = "";
else if (nano_int == 1)
nano = "(GIT)";
else
nano = "(Prerelease)";
g_print ("Runtime version: %d.%d.%d %sn", major, minor, micro, nano);
/* Выводим runtime-версию в виде готовой строки */
g_print ("String runtime version: %sn", gst_version_string());
return 0;
}
Компилируем и запускаем:
$ gcc -Wall -o source source.c $(pkg-config --cflags --libs gstreamer-1.0)
$ ./source
Результат:
GStreamer library successfully initialized
Compile time version: 1.2.4
Runtime version: 1.2.4
String runtime version: GStreamer 1.2.4
Заключение
В следующей статье постараюсь подробно описать процесс создания элементов и компоновки из них конвейера (pipeline), а в практическом разделе попробуем создать что-нибудь поинтереснее.
Материалы по теме
GStreamer Application Development Manual
GStreamer 1.0 Core Reference Manual
Автор: mike_patton