[Kinesis Video Streams] Windows上で各種ソースからの動画のアップロード 〜 kvssinkを利用する場合のGStreamerの使用方法
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の使用方法
このシリーズは、一応、これで完了としたいと思います。