一、基于GStreamer的应用程序初始化
元素,pad和缓冲区是GStreamer的基本概念和最常用的对象。我们使用这些对象的可视化表示形式,以便于后面可以简单地构建的更复杂的管道。初步了解GStreamer API以后,基本上足够我们构建基本应用程序了,下面介绍一下基于GStreamer的应用程序的构建过程。
1、初始化GStreamer
在编写 GStreamer 应用程序时,我们只需要简单地包含gst/gst.h以访问库函数。除此之外,我们还需要初始化GStreamer库。
在可以使用 GStreamer 库之前,必须从主应用程序调用gst_init执行库的必要初始化,并解析特定于GStreamer 的命令行选项。
一个典型的GStreamer应用程序的初始化 GStreamer 的代码,如下所示:
#include <stdio.h>
#include <gst/gst.h>
int main (int argc, char *argv[])
{
const gchar *nano_str;
guint major, minor, micro, nano;
gst_init (&argc, &argv);
gst_version (&major, &minor, µ, &nano);
if (nano == 1)
nano_str = "(CVS)";
else if (nano == 2)
nano_str = "(Prerelease)";
else
nano_str = "";
printf ("This program is linked against GStreamer %d.%d.%d %s\n",
major, minor, micro, nano_str);
return 0;
}
使用GST_VERSION_MAJOR, GST_VERSION_MINOR and GST_VERSION_MICRO 宏获取您正在构建的GStreamer版本,或使用函数 gst_version获取您的应用程序链接所依据的版本。
GStreamer目前使用的方案中,主版本和次版本相同的版本与API和ABI兼容。
还可以使用两个空参数调用gst_init函数,在这种情况下,GStreamer不会解析任何命令行选项。
2、GOption接口
除以上方法外,我们还可以使用GoOption表初始化自己的参数,如下一个示例所示:
#include <gst/gst.h>
int main (int argc, char *argv[])
{
gboolean silent = FALSE;
gchar *savefile = NULL;
GOptionContext *ctx;
GError *err = NULL;
GOptionEntry entries[] = {
{ "silent", 's', 0, G_OPTION_ARG_NONE, &silent, "do not output status information", NULL },
{ "output", 'o', 0, G_OPTION_ARG_STRING, &savefile, "save xml representation of pipeline to FILE and exit", "FILE" },
{ NULL }
};
ctx = g_option_context_new ("- Your application");
g_option_context_add_main_entries (ctx, entries, NULL);
g_option_context_add_group (ctx, gst_init_get_option_group ());
if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
g_print ("Failed to initialize: %s\n", err->message);
g_clear_error (&err);
g_option_context_free (ctx);
return 1;
}
g_option_context_free (ctx);
printf ("Run me with --help to see the Application options appended.\n");
return 0;
}
如本段程序所示,我们可以使用 GOption 表来定义特定于应用程序的命令行选项,并将此表与从gst_init_get_option_group函数返回的选项组一起传递给 GLib 初始化函数。除了标准 GStreamer 选项之外,还将解析您的应用程序选项。
此示例的代码自动从文档中提取,并在GStreamer tarball中的tests/examples/manual下构建。