Windows環境でGStreamerのSRTプラグイン（1.15.0.1）をビルドする（cerbero）

# はじめに
* GStreamerが1.14.0からSRT対応したという話だが、現在のWindows版のインストーラにはSRTプラグインが含まれていない
  * 現在のインストーラ ( https://gstreamer.freedesktop.org/data/pkg/osx/1.14.1/ )
* Windows版は、cerberoという依存アプリを含めてソースをダウンロードしながら自動ビルドするシステムが存在する。
  * https://github.com/GStreamer/cerbero
* cerberoでのビルドを実際に試してみたところ色々と引っかかる部分があったためメモしておく

# おおまかな手順
* 必要手順の事前確認
* 実行環境の準備
* ソースコードの取得
* SRT対応に必要な項目のビルド

# 手順詳細
## 必要手順の事前確認
* githubのトップページから必要な情報を確認する
  * https://github.com/centricular/cerbero#windows
  * 「README」の「Windows」欄がそれ。インストールするものなどが他のOSと比較すると一番複雑
  * 下に記述した「引っかかったポイント」は事前に見ておいたほうが良いと思います。先に進まない時の対応が早くなります（多分）

## 実行環境の準備
* （基本は「README」で確認した内容だが改めて記述）
* Python3のインストール
  * https://www.python.org/downloads/
  * version：3.6.6
  * インストール先： C:\Python36
  * 注意点
    * シンボリックリンク「ptython3.exe」が必要（cerbero内で使用）

```shell:windowsコマンドライン
> cd C:\Python36
> mklink python3.exe python.exe
```

* CMakeのインストール
  * http://www.cmake.org/cmake/resources/software.html 
  * version：cmake-3.12.0-rc1-win64-x64
  * インストール先：C:\CMake
* Gitのインストール
  * http://git-scm.com/download/win
  * version： 2.18.0.windows.1
  * インストール先：C:\Git
  * 注意点
    * インストールオプションを "Checkout as-is, Commit as-is" を付ける
    * メアドとユーザ名を追記する（git cloneに失敗する場合がある）

```shell:windowsコマンドライン
> git config --global user.email "user@host"
> git config --global user.name "user"
```
* Msys/MinGWのインストール
  * http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download
  * version：最新版（2018/07/02時点）MINGW32_NT-6.2 DESKTOP-RT5N0O7 1.0.19(0.48/3/2) 2016-07-13 17:45 i686 Msys
  * インストール先：C:\MinGW
  * 注意点：
    * 自分のMsysの実行環境のパスにスペースが含まれないように注意する
    * インストールすると自動的に現在の名称を使用してMsys下の「home」フォルダ下に実行環境を作成する
      * 例）C:\MinGW\msys\1.0\home\fukum
* MinGW InstrationMaganerでの必要コンポーネントインストール
  * BasicSetup：すべてチェック
  * All Packages：（デフォルト？）
    * （説明では「すべて」とあるが自分は「bin」「dll」と付いたものをいくつか追加チェックして動作した）
* Visual Studioのインストール
  * 表記ではVisualStudio2015ですがVisual Studio 2017 でも動作
  * 以下の関連ファイルもインストールする
    * Microsoft SDK 7.1: http://www.microsoft.com/en-us/download/details.aspx?id=8279
    * Windows Driver Kit 7.1.0: http://msdn.microsoft.com/en-us/windows/hardware/hh852365
* curlのインストール
  * 手順になかったが必要。makeでも実施できそうだったが、以下の方法で代用
  * 最新版libcurlのzipファイルをダウンロード
    * http://curl.haxx.se/download.html
    * 対象ファイル：curl-7.60.0-win64-mingw.zip
  * 解凍したフォルダの中の、「sample」「lib」「include」「bin」の四つのフォルダをC:\MinGWにコピー
* Msysの起動
  * "C:\MinGW\msys\1.0\msys.bat" をダブルクリック（exeを直接叩かない、場所に注意）

## ソースコードの取得
```sh:Msysコンソール
$ mkdir min-div
$ cd min-div
（なんとなく作業フォルダを作成）
 
$ git clone https://github.com/centricular/cerbero.git
（今回は、masterブランチを使用）
```

## SRT対応に必要な項目のビルド
* ビルド対象の確認

```sh:Msysコンソール
$  ./cerbero-uninstalled list | grep gst-
（gstreamer関連のものだけ確認）
```
* <img width="640" alt="スクリーンショット 2018-07-05 9.01.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/44076/9b73939f-da7a-1aa7-7570-91e70ab7ba8d.png">
  * ここでビルド対象のバージョンが確認できる。（今回のインストールバージョンは、1.15.0.1）

* bootstrap 実行

```sh:Msysコンソール
$ cd cerbero
（実行先に移動）
 
$ ./cerbero-uninstalled bootstrap
（1時間くらいかかる）
```

* build gstreamer 関連モジュール実行

```sh:Msysコンソール
$ ./cerbero-uninstalled build gst-plugins-base-1.0
（全26ビルド 2〜3時間くらいかかる）
 
$ ./cerbero-uninstalled build gst-plugins-good-1.0
（全44ビルド２〜３時間くらいかかる）＊重複ビルドはスキップ
 
$ ./cerbero-uninstalled build gst-plugins-bad-1.0
（全５７ビルド４〜５時間くらいかかる）＊重複ビルドはスキップ
 
$ ./cerbero-uninstalled build gst-plugins-ugly-1.0
（全３１ビルド２〜３時間くらいかかる）＊重複ビルドはスキップ
```

* 一通り実行完了すると「cerbero\build\dist\windows_x86_64」にgstreamer環境が構築される
  * 例）「C:\MinGW\msys\1.0\home\fukum\min-dev\cerbero\build\dist\windows_x86_64」
* gstreamer環境は、コマンドラインから普通に実行可能
  * Msys環境下限定の実行ファイルではない
* このフォルダをそのまま同一OSの別PCに配布しても「ある程度」動作することを確認
  * 一部動作がおかしい部分を確認したため完全に動作とはまだ言い切れない

# 動作確認
* GStreamerのサンプル実行
  * <img width="1012" alt="gst-result-normal.png" src="https://qiita-image-store.s3.amazonaws.com/0/44076/5ad36d66-5139-5e77-cccc-204c0aeee28e.png">

* GStreamerのSRTプラグイン実行
  * <img width="1631" alt="gst-result-srt.png" src="https://qiita-image-store.s3.amazonaws.com/0/44076/9282e4b8-44ab-6c91-006f-b457c760d799.png">

# 引っかかったポイント
* ブランチ「1.14.0」でビルドしたがSRTプラグインが入っていない
  * 理由：入っていません
  * 対策：1.15.0.1ブランチ（master)でビルドしましょう
* bootstrap 実行が途中で止まる
  * 理由：curlが入ってない
  * 対策：別系統で入れる（手順に追記）
* bootstrap 実行／gstreamerビルドが途中で止まる
  * 理由：制約のあるネットワーク環境下（社内ネットワークなど）ではwgetでDLできないファイルが存在
     * URLからは直接DLできるような特殊な状況
  * 対策：制約のないネットワーク環境で実施する
* bootstrap 実行／gstreamerビルドが超遅い
  * 理由：ウィルス対策ソフトが原因（特にウィルスバ◯ター）
     * ウィルスバ◯ターは、「チェック対象外フォルダ」を指定しても可動してしまう
  * 対策：「チェック対象外」にする。それでもダメなら一時的に停止する
* bootstrap 実行／gstreamerビルドが処理が進行しているかわからない
  * 理由：画面上での進捗がコンソールのみであるため内部での実行がわからない
  * 対策：タスクマネージャー「詳細」を開いて確認する
    * タスクマネージャー上は「sh」「gcc」などが切り替わるので動いてるのはわかる
* 4時間たっても compile から進まない、再実行しても同様
  * 原因：タスクマネージャーに前の実行プロセス（「make」等）が残って阻害している
      * Ctrl+Cで終了してもタスクマネージャーに前の実行プロセス（「make」等）が残っていた
  * 対策：再実行前にプロセスが残っているか確認して削除してください（PC再起動が確実？）
* (補足)bootstrap 実行できない（Gstreamer 1.14.x）
  * 原因：cerberoは、Gstreamer 1.14.0系までPython2.7を使用しています。Python3.xでは動作しません
  * 対策：Python2.7のみを入れてください（補足：1.14.0ビルドしてもSRTプラグインは入っていません）
  * （蛇足：途中のGstreamer には、Python2.7とPython3.xを両方使用するものが存在します。）


# 参考記事
* [新しい映像伝送プロトコルSRTをgstreamerとVLCで試す](https://qiita.com/tetsu_koba/items/b12a6de83185a5267217)
* [cerberoを使ってVS2015でGStreamerをビルドする](https://qiita.com/ousttrue/items/038f390766c901d9dacc)
* [WindowsのMinGWでlibcurlをインストール](http://d.hatena.ne.jp/tana-laevatein/20100107/1262817443)