libsrtのWindowsビルド方法(2020/5/28時点)

執筆時点でVRizeで盛り上がってるYothubaです。勢いにまかせて流行りのストリーミングプロトコルのSRTを利用するためのライブラリであるlibsrtをWindows向けにビルドする方法を書いていきます！！！！！！！！！！！！！！！
SRTとは？という方は[ここ](https://www.explorer-inc.co.jp/srt/media1902.html)を参照してください。

# 対象者
- SRTを独自のアプリケーションに組み込みたい方

#はじめに
SRTを試す場合**libsrt**を導入する必要があります。Gstreamer、ffmpegなど一部アプリケーションではその必要はありませんが自分のプログラムにSRTを含みたい場合は、当然のことながらlibsrtが**必須**です。
linux系などで利用する場合は簡単にビルドできるのですがWindowsでは手順がややこしくなります。また、SRTのGithubが公開してるビルド手順だとWindowsビルドは失敗する可能性があります。(私は成功しませんでした。)

#前提ライブラリの準備
srtのビルドには前提として
・**pthreads**(vcpkgで明示的に64bit版を指定します)
・**OpenSSL**
の2点が必要です。
`vcpkg install libsrt`で全部込みがインストールできますがsrtのバージョンが古かったり、依存関係が解決できてなかったりするので個別に２つのパッケージをインストールします。
どちらもWindowsの公式パッケージマネージャである**vcpkg**を使ってインストールします。
vcpkgのバージョンは2020.02.04-nohashを利用しています。

## pthreadsについて
pthreadsにはvcpkgで入れたもの以外にもう一つライブラリが必要です。
SRTの[Github](https://github.com/Haivision/srt)のReadMeにやり方が掲載されています。
1. 以下のリンクからpthread-win32をダウンロードします。
https://github.com/GerHobbelt/pthread-win32
ダウンロードしたフォルダの中のpthread_lib.2013.vcxprojを選択しVisualStudioを起動します。(2013verである必要はないようです。私は2017で実行しました。)  
2. 構成が`Release`、`x64`になっていることを確認します。
3. プロジェクトをビルドします。(pthread_libがビルドされることを確認してください)
4. ビルド後、`pthread_lib.lib`が`bin/x64_****_.Release`に生成されているはずです。これをpthreadsの`lib`ファイルにコピーします。
pthreadsのライブラリのパスは`[path to vcpkg]/installed/x64-windows/`以下にあります。

## OpenSSLについて
こちらはvcpkgで通常通りインストールすれば大丈夫です。

# CMakeLists.txtにpthreadsへのパスを通す
githubからクローンしたsrtのフォルダを開くと`CMakeLists.txt`があるのでこれをテキストエディタ(文字検索機能があるものが好ましい)で開きます。
開いたら`PTHREAD`で部分検索します。ヒットしたら一番最初に`PTHREAD`の文字が出てくる直前で下記のコードを追記します。
pthreadのinclude,libディレクトリは先ほど同様`[path to vcpkg]/installed/x64-windows/`です。`PTHREAD_LIBRARY`は必ずディレクトリではなくファイル単体を指定してください。

```cmake

set(PTHREAD_INCLUDE_DIR   pthreadsのincludeディレクトリのpath)
set(PTHREAD_LIBRARY   pthreadsのlibディレクトリ内の.libファイルのpathを全て空白区切りで入力)
```

ちなみに私の場合はこんな感じです。

```cmake

set(PTHREAD_INCLUDE_DIR C:/vcpkg/packages/pthreads_x86-windows/include)
set(PTHREAD_LIBRARY C:/vcpkg/packages/pthreads_x86-windows/lib/pthreadVC3.lib C:/vcpkg/packages/pthreads_x86-windows/lib/pthreadVCE3.lib C:/vcpkg/packages/pthreads_x86-windows/lib/pthreadVSE3.lib C:/vcpkg/packages/pthreads_x86-windows/lib/pthread_lib.lib)
````

#いざビルド！
srtのディレクトリ下で行いますが、そのまま実行すると既存のファイルとビルドファイルが混在してしまうので`build`などの分かりやすい名前でディレクトリを作成し、buildがカレントディレクトリの状態で以下のコマンドを実行してください。
僕の場合のディレクトリ構成を載せておきます。

```
srt-1.3.4/
   　├ srt-1.3.4/
          ├ build/
          ├ CMakeLists.txt
          ├ その他
```

makeコマンドはこちらです。
`[vcpkg root]`のところにはvcpkgをインストールしたディレクトリを指定してください。

```cmake
cmake ../ -G "Visual Studio 16 2019" -A x64
             -DCMAKE_TOOLCHAIN_FILE=[vcpkg root]\scripts\buildsystems\vcpkg.cmake
```
makeが出来たら`build`ディレクトリ下にSRT.slnというプロジェクトファイルが生成されているので選択してVisualStudio2019を起動します。

起動したらビルドからソリューションのビルドを選択します。
![qiita01_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411974/4f7ac151-355d-76dc-b0a5-fc3d1b0836b4.png)

ビルドが完了したら今度はビルドから構成マネージャーを開きます。
![qiita01_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411974/a8a2f8e6-e96f-7327-a42f-ab16a9397839.png)

構成マネージャーからINSTALLプロジェクトをビルド対象にします。
![コメント 2020-05-30 014803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411974/cf3e5fbb-534e-a9b7-6008-9012dd5c207f.png)

もう一度ソリューションのビルドを実行します。
これでビルドは完了です！
デフォルトであれば`Program Files(x86)`下にSRTディレクトリが作成されます！
![コメント 2020-05-30 015208.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411974/58eed405-95f8-fec9-044d-335dc08eda2f.png)

後はVisualStudioでSRTを利用したいプロジェクトを作成し、先ほど生成されたSRTディレクトリ内のincludeディレクトリなどのパスをVisualStudioに通してあげます。
ちなみにですが、今後外部ライブラリを使うにあたって、一々パス指定をするのは面倒なので、私はライブラリをひとまとめにして管理しています。
SRTのライブラリも`include`,`lib`,`bin`ディレクトリを全て`userLibrary`というディレクトリに移動させています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411974/cb7ced01-77d4-a170-a1f1-535dbcdae4b5.png)

ただ、それでも`include`、`lib`、`dll`は個別に指定してあげなくてはいけないのでそれが面倒な場合は、プロパティシートを使うと簡単に管理できます。
そこらへんの話は[こちら](https://qiita.com/Yothuba3/items/fe4e27f4559c65af14e3)を見てもらえたらと思います。

#おわりに
Linuxとかだと数行で終わることがWindowsになっただけでこんだけ複雑になるとほんとにどうにかならないかなーという気持ちです。近々WSLに来るアプデでどうなるのか楽しみです。
もしも誤記や手順通りにやっても上手くいかなかった場合は気軽に聞いてください。わかる範囲で答えます。