VS2015 Community + GStreamer 1.6.1


アドベントカレンダー12日目です。

はじめに
-------

今日は [Day 5 のコメント](http://qiita.com/shocrunch/items/51fdb6122a40bdd45e46#comment-14d63ee115d345b9db3e)で熱い情報をもらったので、Visual Studio 2015 で GStreamer アプリを開発する方法について書きます。

Visual Studio の設定は[このbugzillaのスレッド](https://bugzilla.gnome.org/show_bug.cgi?id=758738)を元にしています。 

このスレッドを見つけてくれた musashi_dog さんに感謝です。ありがとうございました。

ゴール
-------

- Windows 10 (x64)
- Microsoft Visual Studio Community 2015
- GStremaer 1.6.1

こんな感じ

![play.png](https://qiita-image-store.s3.amazonaws.com/0/97187/559e5ab0-f06f-f7ec-e885-d34c5297d443.png)

手順
-------

1. Microsoft Visual Studio Community 2015 のインストール
1. GStreamer のインストール
1. Project の作成・設定
1. 動作確認

詳細
-------

### Microsoft Visual Studio Community 2015 のインストール

[Visual Studio のサイト](https://www.visualstudio.com/downloads/download-visual-studio-vs)から、Visual Studio Community をダウンロードし、インストールしてください。

いろんな言語の選択がありますが、とりあえずC++が使えれば問題ありません。

### GStreamer のインストール

[GStreamer のダウンロードページ](http://gstreamer.freedesktop.org/download/)から、GStreamer 1.6.1をダウンロードします。
ちょっとイマドキな見た目ではないので、わかりにくいかも...なので、ダウンロードすべきファイルはスクリーンショットを参照してください。

![inst.png](https://qiita-image-store.s3.amazonaws.com/0/97187/aeaf9314-7d4f-4273-c91e-868348c9e434.png)

また、インストールの際は **Complete** を選択してください。

### Project の作成・設定

#### 作成

Project は "Win32 Console Application" で作りましょう。

#### 設定1: ターゲットを x64 に

![64.png](https://qiita-image-store.s3.amazonaws.com/0/97187/5cb43f9f-cfc9-7112-e291-a35f8725278e.png)

#### 設定2: Property Manager を表示

![propertym.png](https://qiita-image-store.s3.amazonaws.com/0/97187/edabd112-50ec-4678-997b-0b23b104c513.png)

#### 設定3: GStreamer のプロパティシートを適用

![dd.png](https://qiita-image-store.s3.amazonaws.com/0/97187/64ab761f-79e2-1c20-9439-06ac0145d57e.png)

![props.png](https://qiita-image-store.s3.amazonaws.com/0/97187/ca2a5f7a-c7c2-70e9-d93a-e51e33676255.png)

※ `gstreamer`ディレクトリは通常 `C:` 直下にあります。

ちなみに、このプロパティシート。linux の pkg-confing に対応する分あります。
`pkg-config --libs --cflags gstreamer-1.0`とか書かなくていいのでちょっと便利 :)

#### 設定4: Randomized Base Address を No に設定

これがとても大切な設定。bugzillaからの情報をもとにしたヤツです。

![propro.png](https://qiita-image-store.s3.amazonaws.com/0/97187/e99cecf8-80bc-ab36-fea0-55ac29636ddf.png)

![rand.png](https://qiita-image-store.s3.amazonaws.com/0/97187/f8217019-b241-1bd1-f2e5-466fbf0112ae.png)

これで設定完了です！

### 動作確認

とりあえず、動作確認として`videotestsrc ! autovideosink` を動かしてみましょう。

```c
#include <gst/gst.h>

int main(int argc, char *argv[])
{
	GString *launch_str;
	GstElement *pipeline;
	GstBus *bus;
	GstMessage *msg;

	gst_init(&argc, &argv);

	launch_str = g_string_new(NULL);
	g_string_printf(launch_str,
		"videotestsrc ! autovideosink" , NULL);

	pipeline = gst_parse_launch(launch_str->str, NULL);

	if (pipeline == NULL) {
		g_print("parse_launch fail.\n");
		return 1;
	}

	gst_element_set_state(pipeline, GST_STATE_PLAYING);

	bus = gst_element_get_bus(pipeline);
	gint handle_msg;
	handle_msg = GST_MESSAGE_EOS | GST_MESSAGE_ERROR;
	msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, (GstMessageType)handle_msg);

	GError *err;
	gchar *debug_info;
	if (msg != NULL)
		switch (GST_MESSAGE_TYPE(msg)) {
		case GST_MESSAGE_ERROR:
			gst_message_parse_error(msg, &err, &debug_info);
			g_printerr("Error received from element %s: %s\n", GST_OBJECT_NAME(msg->src), err->message);
			g_printerr("Debugging information: %s\n", debug_info ? debug_info : "none");
			g_clear_error(&err);
			g_free(debug_info);
			break;
		case GST_MESSAGE_EOS:
			g_print("End-Of-Stream reached.\n");
			break;
		default:
			/* We should not reach here because we only asked for ERRORs and EOS */
			g_printerr("Unexpected message received.\n");
			break;
		}
	gst_object_unref(bus);
	gst_element_set_state(pipeline, GST_STATE_NULL);
	gst_object_unref(pipeline);

	return 0;
}

```

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/97187/2834f01f-a664-48cf-3eb3-74e4dace07a2.png)

ちょっとものたりませんね...

では、[Blender.org]() から Kajimba-snippets をダウンロードして、これを再生してみましょう。

コードは以下の部分を

```c
	g_string_printf(launch_str,
		"videotestsrc ! autovideosink" , NULL);
```

このように変更してください

```c
	g_string_printf(launch_str,
		"filesrc location=C:/Users/shocrunch/Downloads/Kajimba-snippets.mp4 ! decodebin ! videoconvert ! autovideosink" , NULL);
```

location には、ダウンロードしたMP4ファイルのパスを指定してください。
パスは、ファイルを右クリックして見れるものを `\ ` から `/` に変えるのがポイントです。

![play.png](https://qiita-image-store.s3.amazonaws.com/0/97187/172b279b-deb8-b72e-5841-03aceb465473.png)

再生できたのではないでしょうか!?

これで Visual Studio の Completion を使って GStreamer アプリが書けますね♪