GStreamer は、XML を使ってパイプラインの定義を保存したりロードしたりできます。
ここでは、パイプラインを XML に保存する方法、パイプラインを保存した XML ファイルをあとでロードして使う方法について説明します。
GstElement の XML への変換
まず、簡単なパイプラインを作成し、これを gst_xml_write_file () を使って標準出力に書き出します。次に示すのは、MP3 プレーヤーパイプラインを作成し、これを標準出力とファイルの両方に書き出す例です。このプログラムを実行するときは、ディスク上の MP3 ファイル 1 つを引数に指定します。
#include <stdlib.h>
#include <gst/gst.h>
gboolean playing;
int
main (int argc, char *argv[])
{
GstElement *filesrc, *osssink, *decode;
GstElement *pipeline;
gst_init (&argc,&argv);
if (argc != 2) {
g_print ("usage: %s <mp3 filename>\n", argv[0]);
exit (-1);
}
/* create a new pipeline to hold the elements */
pipeline = gst_element_factory_make ("pipeline", "pipeline");
g_assert (pipeline != NULL);
/* create a disk reader */
filesrc = gst_element_factory_make ("filesrc", "disk_source");
g_assert (filesrc != NULL);
g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
/* and an audio sink */
osssink = gst_element_factory_make ("osssink", "play_audio");
g_assert (osssink != NULL);
decode = gst_element_factory_make ("mad", "decode");
g_assert (decode != NULL);
/* add objects to the main pipeline */
gst_bin_add_many (GST_BIN (pipeline), filesrc, decode, osssink, NULL);
gst_element_link_many (filesrc, decode, osssink, NULL);
/* write the pipeline to stdout */
gst_xml_write_file (GST_ELEMENT (pipeline), stdout);
/* write the bin to a file */
gst_xml_write_file (GST_ELEMENT (pipeline), fopen ("xmlTest.gst", "w"));
exit (0);
}
上のコードの中で最も重要なのは、次の行です。
gst_xml_write_file (GST_ELEMENT (pipeline), stdout);
gst_xml_write_file () は、指定されたエレメントを xmlDocPtr に変換し、これをフォーマットしてファイルに保存します。ディスクに保存するには、2番目の引数に fopen(2) で返された値を指定します。
エレメント間のパッドのリンクやエレメントのパラメータとともに、完全なエレメントの階層構造が保存されます。GStreamer の将来のバージョンでは、シグナルも XML ファイルに保存できるようになります。