Amazon Kinesis Video StreamsでPanasonicやAXISのMJPEGの映像をアップロードするメモ

Webカメラの映像をAmazon Kinesis Video Streamsにアップロードしてみている。

Kineisis Video StreamsではアップロードにKinesis ビデオストリーム プロデューサーライブラリ - Amazon Kinesis Video Streamsを使うと良いそうで、 gstreamerの kvssink というシンクエレメントのプラグインも用意されているので、これを試す。

github.com

プロデューサーライブラリはこれの kinesis-video-native-build というディレクトリで install-script を実行すると、 ローカルディレクトリ以下だけで動かせるよう、gstreamer 本体を含む必要なライブラリ一式ソースからダウンロードしてビルドしてくれる。 このへんの説明は Kinesis ビデオストリーム プロデューサーライブラリ - Amazon Kinesis Video Streams などに書いてある。

ところで、よくあるPanasonicやAXISというメーカーの監視カメラにはhttpでmjpegを取得するAPIが用意されているものがある。Panasonicに至っては、映像を取得するAPIはMJPEGしか無いものもある。 そこで、gstreamerでは souphttpsrc というソースエレメントを使うとhttpのリクエストを簡単に行える。 単純にMJPEGの映像を再生するだけであれば、このように簡単にできる。

$ gst-launch-1.0 souphttpsrc location=https://<user>:<passwd>@<webcam mjpeg api uri> ! jpegparse ! jpegdec ! autvideosink

MJPEGAPIのURIは、Panasonicなら http://<webcam ip>/nphMotionJpeg?Resolution=640x480 とか、 AXISなら http://<webcam ip>/axis-cgi/mjpg/video.cgi という感じ。

しかし、上に書いたプロデューサーライブラリのgstreamerには souphttpsrc が含まれていない。 ビルドするライブラリ一式の中に libsoup が入っていないためだ。 install-scriptにlibsoupのビルドを追加しても良いが、ただでさえinstall-scriptは時間がかかるので、kvssinkプラグインのみビルドして使うことにした。 aptでインストールできるgstreamerはsouphttpsrcが入っているので、これを使うようにDockerfileにした。 gstreamerでは GST_PLUGIN_PATH を設定してやるとプラグインが追加できる。 log4cplus-1.2.0とlibgtestはaptでインストールできなかったのでビルドした。これだと、install-scriptでビルドするより圧倒的に早いしプラグインも多い。

github.com

Docker ビルドし、実行したら、kvssink が使えるのでgstreamerのパイプラインを以下のようにつないで実行する

$ gst-launch-1.0 souphttpsrc location=http://<webcam mjpeg api uri> ! jpegparse ! jpegdec ! queue ! x264enc tune=zerolatency ! h264parse ! kvssink stream-name=<stream name>

とりあえず、これだけで、AWSコンソールでのプレビューはできる。

  • プレビューのためにh264エンコードしているが、kvssink自体はどんなコーデックのフラグメントでも送ってくれる。
  • h264エンコードのパラメータで、 tune=zerolatency にしないとうまく行かなかったが、PCのスペックのせいかもしれない。
  • このままではフレームレートは元のMJPEGと合ってないので、 videorate フィルタでフレームレート調整しないといけないかもしれない。