Знайомство з GStreamer: ініціалізація

image

Трохи більше року тому користувач POPSuL опублікував серію статей (1, 2 і 3 про мультимедійному фреймворку GStreamer (за що йому величезне спасибі). Я б хотів продовжити його починання, зробивши більший наголос на кодову складову, ніж на інструменти командного рядка, що входять до складу GStreamer.

У даній статті я розповім про саму першій операції при роботі з фреймворком — ініціалізації. А як закріплення матеріалу ми надрукуємо версію GStreamer.

Середовище розробки

Приклад зі статті виконаний в Ubuntu 14.04 c встановленим GStreamer версії 1.2.4. Компіляція виконується наступним чином:

$ gcc-Wall-source o 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 initialized\n");

/* Виводимо версію при компіляції */
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 %s\n", 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 %s\n", major, minor, micro, nano);

/* Виводимо runtime-версію у вигляді готової рядка */
g_print ("String runtime version: %s\n", gst_version_string());
return 0;
}

Компілюємо і запускаємо:

$ gcc-Wall-source o source.c $(pkg-config --cflags --libs gstreamer-1.0)
$ ./source

Результат:

GStreamer library successfully initialized
Compile time версія: 1.2.4 
Runtime version: 1.2.4 
String runtime version: GStreamer 1.2.4

Висновок

У наступній статті постараюся докладно описати процес створення елементів і компонування з них конвеєра (pipeline), а в практичному розділі спробуємо створити що-небудь цікавіше.

Матеріали за темою

GStreamer Application Development Manual
GStreamer Core 1.0 Reference Manual

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.