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

2020.02.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

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

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

参考:例: Kinesis ビデオストリーム プロデューサー SDK GStreamer プラグイン

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

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

今回は、Raspberry Pi 上で、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 Raspberry Pi上での入力ソース

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

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

(1) テスト入力

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

$ gst-launch-1.0 videotestsrc ! autovideosink

(2) USB接続のWebカメラ

v4l2srcで認識できているため、デバイスIDを指定して利用可能です。デバイスのパス(/dev/video??)は、カメラの接続数、接続順などによって変化します。

$ gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! video/x-raw ! autovideosink

(3) RTSPサーバ

RTPSサーバからの入力は、rtspsrcエレメントで受けることができます。RTPSサーバでは、H264へのエンコードが終わっているので、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にインストールして利用させて頂きました。

4 kvssinkでの送信

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

h264parse ! video/x-h264,stream-format=avc,alignment=au ! kvssink stream-name="STREAM_NAME" access-key="xxxxxxx" secret-key="xxxxxxx"  aws-region="ap-northeast-1"

また、入力が、h264にエンコードされていない場合、Raspberry Pi のハードウエアエンコードを利用するomxh264encを使用します。

omxh264enc periodicty-idr=45 inline-header=FALSE

※ x264encは、ソフトウエアエンコードなので、omxh264encが、俄然お勧めです。[Kinesis Video Streams] Raspberry Piでh.264エンコードをする3種類の方法

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

(1) テスト入力

gst-launch-1.0 -v videotestsrc ! video/x-raw, width=640, height=480, framerate=30/1 ! omxh264enc periodicty-idr=45 inline-header=FALSE ! h264parse ! video/x-h264,stream-format=avc,alignment=au ! kvssink stream-name=testStream access-key="xxxxxxx" secret-key="xxxxxxx"  aws-region="ap-northeast-1"

(2) USB接続のWebカメラ

$ gst-launch-1.0 -v v4l2src ! videoconvert ! video/x-raw,format=I420,width=640,height=480,framerate=30/1 ! omxh264enc periodicty-idr=45 inline-header=FALSE ! h264parse ! video/x-h264,stream-format=avc,alignment=au ! kvssink stream-name=testStream access-key="xxxxxxx" secret-key="xxxxxxx"  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=testStream access-key="XXXXX" secret-key="XXXXX" aws-region="ap-northeast-1"

5 最後に

個人的には、GStreamerの各種エレメントを使いこなすのは、結構難しいと感じています。

下記は、今回と同じ作業を、Macで行ったものです。 できるだけコピー&ペーストで利用できるコマンドラインを、揃えて行けたらいいなと思っています。

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