Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【Windows(MSVC)】

2020.02.07

1 はじめに

CX事業本部の平内(SIN)です。

AWS Kinesis Video Streams(以下、Kinesis Video Streams)では、C++,Java,Android用の プロデューサーライブラリが提供されています。

この中で、C++では、各種OS用のものをコンパイルすることで、GStreamer用のエレメント(シンク)を構築することが出来ます。

ここDevelopers.IOでもMacや、RaspberryPI上でこれを試している記事が公開されています。


Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【MacBook Pro】– ClassmethodサーバーレスAdvent Calendar 2017
Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【Raspberry Pi】– ClassmethodサーバーレスAdvent Calendar 2017
[Amazon Kinesis Video Streams] Dockerイメージのプロデューサーライブラリで動画配信(Raspberry Pi編)

今回、内容としては同じですが、Windows上で作業してみた時の記録です。

「プロデューサーSDKのビルドと実行」では、「Minimalist GNU for Windows (MinGW)」と「Microsoft Visual C++ Compiler (MSVC)」の2種類がドキュメントに記載されていますが、ここで試しているのは後者の方です。

なお、後者の場合は、Microsoft Visual Studio (C++)が、必要です。

参考:
Windows で C++ プロデューサー SDK を使用する
Github awslabs/amazon-kinesis-video-streams-producer-sdk-cpp

2 要件

コンパイルするための要件は、以下のとおりです。

(1) Microsoft Windows バージョン 7 以降

Windwos 10 で試しました。

(2) Microsoft .NET Framework バージョン 4.6.1 以降

.NET Frameworkは、4.8がインストールされています。

(3) Windows PowerShell バージョン 5.1

PowerShellのバージョンは、5.1.18362.145となっていました。

PS C:\Users\sin> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.18362.145
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.145
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

(4)Git [Use Git from the Windows Command Prompt]

コマンドプロプトから、Gitが使えるようになっています。

3 コンパイル

(1) 作業場所

作業場所をC:¥kvsとしています。

> mkdir d:¥kvs
> cd d:¥kvs

必要なツールのダウンロードやインストールもここで行われ、最終的にこのディレクトリは、2.7Gを超えます。

(2) git clone

GitHubのリポジトリをCloneします。

> git clone https://github.com/awslabs/amazon-kinesis-video-streams-producer-sdk-cpp.git
> cd amazon-kinesis-video-streams-producer-sdk-cpp

(3) ビルドツールのインストール

ここからは、コマンドプロンプトは、管理者権限が開く必要があります。

> cd kinesis-video-native-build
> vs-buildtools-install.bat

上記が完了した時点で、Visual StudioのセットアップのためWinddowsの再起動が必要です。

(4) ビルド

再起動後、再び、管理者権限でコマンドプロンプトを開き、windows-install.bat 64(システムが32ビットの場合は、windows-install.bat 32)を実行して、SDKをビルドしGeneStreamプラグイン(kvssink)を作成します。なお、windows-install.batでは、コンパイルの前に、必要なツール(CMake,jsmn,Perl,curl,GoogleTest,Log4Cplus,GStreamer等)のインストールも行われます。

> windows-install.bat 64

(5) ビルドに失敗

実は、当初コンパイルは、下記のように 「winnt.h(2487): error C2118: 添字が負の数です。」というエラーで失敗してしまいました。

ビルドに失敗しました。

"C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\pic_test.vcxproj" (既定のターゲット) (1) ->
"C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\kvspic.vcxproj" (既定のターゲット) (3) ->
(ClCompile ターゲット) ->
  c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\winnt.h(2487): error C2118: 添字が負の数です。 [C:\kvs\amazon-kinesis-video-streams-producer-sdk
-cpp\kinesis-video-native-build\kvspic.vcxproj]
  c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\winnt.h(2487): error C2118: 添字が負の数です。 [C:\kvs\amazon-kinesis-video-streams-producer-sdk

Issuesに下記の記事があったので、Windwos SDKを1つ前のものに入れ替えてみて、もう一度、回してみると、今度は問題なくコンパイルできました。
windows native build x64 compilation error: incompatibility with Windows 10 SDK 18362 #242

入れ変えたWindows SDKは、Visual Studio 2019 のインストールでセットアップされた(10.0.18362.0)から、一つ前の(10.0.17763.0)へです。

4 GStreamerへのパス設定

gstreamerの各種ツールは、downloads/gstreamerの下にインストールされます。

コンパイル終了時は、パスが通されていますので、そのまま利用可能ですが、次回以降は、ここへのパスの設定が必要です。

> gst-launch-1.0 --version
gst-launch-1.0 version 1.14.1
GStreamer 1.14.1
Unknown package origin

GStreamerへのパス設定は、以下のようになります。

set PATH=%PATH%;C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\downloads\gstreamer\1.0\x86_64\bin

5 GStreamerのライブラリのパス設定

コンパイルして生成したkvssinkは、ライプラリパスを通さないと利用できません。

>gst-inspect-1.0 kvssink
No such element or plugin 'kvssink'

コンパイルされた、gstreamerのエレメントは、Releaseの下に置かれます。Windowsでのkvssinkの実体は、gstkvssink.dllです。

また、gstreamerの各種シンクは、downloads\gstreamer\1.0\x86_64\lib\gstreamer-1.0に入っています。

gstreamerで利用可能なようにライブラリへのパスを指定する要領は、以下のとおりとなります。

kvssinkへのパスをGST_PLUGIN_PATHとする

set GST_PLUGIN_PATH=C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\Release

gstreamerのプラグインの場所を指定する(上記のGST_PLUGIN_PATHも追加する)

set GST_PLUGIN_SYSTEM_PATH=C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\downloads\gstreamer\1.0\x86_64\lib\gstreamer-1.0
set GST_PLUGIN_SYSTEM_PATH=%GST_PLUGIN_SYSTEM_PATH%;%GST_PLUGIN_PATH%

どこからでもgstkvssink.dllが使えるようにパスも追加しておきます。

set Path=%Path%;C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\Release

gst-inspect-1.0で見えれば、kvssinkが利用可能になっています。

>gst-inspect-1.0 kvssink
Factory Details:
  Rank                     primary + 10 (266)
  Long-name                KVS Sink
  Klass                    Sink/Video/Network
  Description              GStreamer AWS KVS plugin
  Author                   AWS KVS <kinesis-video-support@amazon.com>

Plugin Details:
  Name                     kvssink
  Description              GStreamer AWS KVS plugin
  Filename                 C:\kvs\amazon-kinesis-video-streams-producer-sdk-cpp\kinesis-video-native-build\Release\gstkvssink.dll
  Version                  1.0
  License                  Proprietary
  Source module            kvssinkpackage
  Binary package           GStreamer
  Origin URL               http://gstreamer.net/
//・・・略

6 デバイス名の取得

USBにWebカメラを接続し、gst-device-monitor-1.0コマンドを実行すると、利用可能な入力が列挙されます。

「Device found」で「HD Pro Webcam C920」が表示されており、認識され利用可能であることが分かります。

>gst-device-monitor-1.0
Device found:

  name  : HD Pro Webcam C920
  class : Video/Source
  caps  : video/x-raw, format=(string)YUY2, width=(int)640, height=(int)480, framerate=(fraction)[ 5/1, 30/1 ], pixel-aspect-ratio=(fraction)1/1;
          video/x-raw, format=(string)YUY2, width=(int)160, height=(int)90, framerate=(fraction)[ 5/1, 30/1 ], pixel-aspect-ratio=(fraction)1/1;

//・・・略
          image/jpeg, width=(int)1600, height=(int)896, framerate=(fraction)[ 5/1, 30/1 ], pixel-aspect-ratio=(fraction)1/1;
          image/jpeg, width=(int)1920, height=(int)1080, framerate=(fraction)[ 5/1, 30/1 ], pixel-aspect-ratio=(fraction)1/1;
  gst-launch-1.0 ksvideosrc device-path="\\\\\?\\usb\#vid_046d\&pid_0892\&mi_00\#6\&b600736\&0\&0000\#\{6994ad05-93ef-11d0-a3cc-00a0c9223196\}\\global" ! ...

デバイスのパスは、上記の出力をそのままコピーして利用できます。下記では、そのままautovideosinkに送って確認しています。デバイスパスは、/dev/video0とかでは無いので、ちょっと面倒そうです。

> gst-launch-1.0 ksvideosrc device-path="\\\\\?\\usb\#vid_046d\&pid_0892\&mi_00\#6\&b600736\&0\&0000\#\{6994ad05-93ef-11d0-a3cc-00a0c9223196\}\\global" ! autovideosink

なお、入力の指定は、ksvideosrc( Windows kernel streaming plugin)も利用可能です。

gst-launch-1.0 ksvideosrc ! autovideosink

7 Kinesis Video Streamsへの送信

kvssinkのパラメータを簡略化するため、以下の環境変数を設定します。

set AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxx
set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxx
set AWS_DEFAULT_REGION=ap-northeast-1

下記のコマンドで、Kinesis Video Streamsへの送信が可能です。

>gst-launch-1.0 ksvideosrc do-timestamp=TRUE ! video/x-raw,width=640,height=480,framerate=30/1 ! videoconvert ! x264enc bframes=0 key-int-max=45 bitrate=512 ! video/x-h264,profile=baseline,stream-format=avc,alignment=au ! kvssink stream-name="stream-name"

8 最後に

今回は、WindowsからKinesis Video Streamsへの送信を確認してみました。

Ubuntuと違って、min-install-scriptが使えないので、コンパイルが必要でセットアップには少し時間を要します。特に躓くところはありませんでしたが、コンパイルエラーとなる場合は、とりあえず、Windows 10 のSDKを(10.0.17763.0)に合せるのが簡単でしょう。(Visual Studio 2017だったら、そのまま行けると思います)