Знакомство с GStreamer: инициализация

в 11:18, , рубрики: gstreamer, разработка

image

Чуть больше года назад пользователь 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, &ampmicro, &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

Источник

Поделиться

* - обязательные к заполнению поля