[Kinesis Video Streams] Windows上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法

2020.02.23

1 はじめに

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

Kinesis Video Streamsでは、プロデューサーの一つとして、標準的なストリーミング管理ライブラリであるGStreamerのプラグインとして利用可能なシンクエンメント(kvssink)が提供されています。
参考:例: Kinesis ビデオストリーム プロデューサー SDK GStreamer プラグイン

GStreamerでは、gst-launch-1.0を使用して、コマンドラインから軽易に下記のような構成を実現することが可能になります。

各種リソース ->  フィルタ、変換など -> kvssink -> Kinesis Video Streasms

今回は、Windows上で、kvssinkを利用する方法を色々試してみた記録です。

2 kvssinkについて

最初に、kvssinkについて確認しました。

Gstreamerに含まれる、gst-inspect-1.0というツールを利用すると、エレメントの詳細情報を見ることができます。

$ gst-inspect-1.0 kvssink

上記コマンドでは、エレメントの入口(SINK)と、出口(SRC)が表示されますが、kvssinkは、シンクとして実装されているため、SRCは無く、SINKは、下記のとおりとなっています。

ここから、Videoにつては、x-h264及び、x-h265に対応していることが分かります。なお、ビデオのフォーマットは、avcのみです。

Pad Templates:
  SINK template: 'video_%u'
    Availability: On request
    Capabilities:
      video/x-h264
          stream-format: avc
              alignment: au
                  width: [ 16, 2147483647 ]
                 height: [ 16, 2147483647 ]
      video/x-h265
              alignment: au
                  width: [ 16, 2147483647 ]
                 height: [ 16, 2147483647 ]

  SINK template: 'audio_%u'
    Availability: On request
    Capabilities:
      audio/mpeg
            mpegversion: { (int)2, (int)4 }
          stream-format: raw
               channels: [ 1, 2147483647 ]
                   rate: [ 1, 2147483647 ]

同コマンドでは、エレメントに指定できるパラメータも確認できます。パラメータのいくつかを以下に、列挙させて頂きます。

  • stream-name: ストリーム名 Default: "DEFAULT_STREAM"
  • access-key: AWS アクセスキー
  • secret-key: AWS シークレットキー
  • aws-region: AWS リージョン Default: "us-west-2"
  • retention-period: ストリームの保存期間(単位:時間) Default: 2
  • streaming-type: タイプ Default: realtime
    • 0: realtime - streaming type realtime
    • 1: near-realtime - streaming type near realtime
    • 2: offline - streaming type offline
  • content-type: コンテンツタイプ Default: null
  • max-latency: 最大遅延(単位:秒) Default: 60
  • fragment-duration: フラグメント遅延(単位:ミリ秒)Default: 2000
  • timecode-scale: Timecode Scale.(単位:ミリ秒)Default: 1
  • key-frame-fragmentation: trueの場合、各キーフレームで新しいフラグメントを生成します。それ以外の場合、fragment-durationが経過した後、最初のキーフレームで新しいフラグメントを生成する Default: true

3 Windows上での入力ソース

続いてWindows上で、いくつかの動画リソースについて確認してみます。

ここでは、いきなりkvssinkに出力すると、その確認が、やや複雑になるため、画面で動画を確認するだけとし、出力先にautovideosinkを利用します。

(1) テスト入力

テストパターンの入力元となるvideotestsrcを入力として、autovideosink に出力する場合は下記のようになります。静止画にも見えますが、右下の砂嵐を見ると動画であることを感じられます

$ gst-launch-1.0 videotestsrc ! autovideosink

(2) USB接続のWebカメラ

ksvideosrcで認識できているため、デバイス名を指定して利用可能です。(下記は、カメラが1台しか接続されていないので、デバイス名は省略されています)

> gst-launch-1.0 ksvideosrc ! videoconvert ! video/x-raw ! autovideosink

gst-device-monitor-1.0で確認すると、デバイス名は、他のOSに比べて、ちょっと複雑です。

>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;
        gst-launch-1.0 ksvideosrc device-path="\\\\\?\\usb\#vid_046d\&pid_0892\&mi_00\#6\&b600736\&0\&0000\#\{6994ad05-93ef-11d0-a3cc-00a0c9223196\}\\global" ! ...

(略)

device-path= の後ろがデバイス名となります。

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

(3) RTSPサーバ

RTPSサーバからの入力は、rtspsrc エレメントで受けることができます。RTPSサーバでは、h.264へのエンコードが終わっているので、decodebinで逆に戻しています。

> gst-launch-1.0 rtspsrc location=rtsp://192.168.0.110 ! decodebin !  autovideosink

※RTSPサーバは、Live-Reporter - 監視カメラ https://apps.apple.com/jp/app/live-reporter-監視カメラ/id996017825をiPhoneにインストールして利用させて頂きました。

3 kvssinkでの送信

kvssinkは、最初に確認したとおり、h264で、stream-format=avc,alignment=auな入力を要求するため、シンクに送る前に、以下のように、h264parseで、パースします。

h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink

また、入力が、h.264にエンコードされていない場合、GStreamerに用意されているエンコーダーであるx264encを使用します。

x264enc bframes=0 key-int-max=45 bitrate=512 

上記を参考に、入力を、kinesis Video Streamsに送る場合のコマンドラインは、以下のようになりました。

(1) テスト入力

テスト入力を ksvideosrc に変更するだけで、そのまま送信可能です。

> gst-launch-1.0 videotestsrc ! videoconvert ! video/x-raw,format=I420,width=960,height=720 ! videoconvert ! x264enc bframes=0 key-int-max=45 bitrate=512 ! h264parse ! video/x-h264,profile=baseline,stream-format=avc,alignment=au ! kvssink stream-name=sampleStream access-key="XXXXX" secret-key="XXXXX" aws-region="ap-northeast-1"

(2) USB接続のWebカメラ

入力を ksvideosrc に変更し、解像度を指定しています。

> gst-launch-1.0 ksvideosrc ! video/x-raw,width=640,height=480 ! videoconvert ! x264enc bframes=0 key-int-max=45 bitrate=512 ! h264parse ! video/x-h264,profile=baseline,stream-format=avc,alignment=au ! kvssink stream-name=sampleStream access-key="XXXXX" secret-key="XXXXX" aws-region="ap-northeast-1"

(3) RTSPサーバ

RTSPサーバでh264にエンコードされたデータを rtph264depay でそのまま使用します。

> gst-launch-1.0 rtspsrc location=rtsp://192.168.0.110 short-header=TRUE ! rtph264depay ! video/x-h264, format=avc,alignment=au ! h264parse ! kvssink stream-name=sampleStream access-key="XXXXX" secret-key="XXXXX" aws-region="ap-northeast-1"

4 最後に

ちょっと手強い、GStreamerの利用方法ですが、できるだけコピー&ペーストで利用できるコマンドラインを揃えようと、ここまで各種OSで作業してきました。


[Kinesis Video Streams] Raspberry Pi 上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
[Kinesis Video Streams] Mac上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法

このシリーズは、一応、これで完了としたいと思います。