この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
1 はじめに
CX事業本部の平内(SIN)です。
Kinesis Video Streamsへの動画の送信は、通常、GStreamerとシンク(kvssink)の組み合わせで行われますが、GStreamerの基本的なエレメントを使用して、同時に、複数のストリームに書き込む要領を試してみました。
2 coreelements (tee及び、queue)
GStreamsには、Linuxのように、基本的な操作を行うエレメントが用意されています。今回は、この中からteeとqueueを使用しています。
$ gst-inspect-1.0 | grep core
coreelements: streamiddemux: Streamid Demux
coreelements: valve: Valve element
coreelements: multiqueue: MultiQueue
coreelements: typefind: TypeFind
coreelements: tee: Tee pipe fitting
coreelements: filesink: File Sink
coreelements: queue2: Queue 2
coreelements: queue: Queue
coreelements: output-selector: Output selector
coreelements: input-selector: Input selector
coreelements: identity: Identity
coreelements: funnel: Funnel pipe fitting
coreelements: filesrc: File Source
coreelements: fdsink: Filedescriptor Sink
coreelements: fdsrc: Filedescriptor Source
coreelements: fakesink: Fake Sink
coreelements: fakesrc: Fake Source
coreelements: downloadbuffer: DownloadBuffer
coreelements: dataurisrc: data: URI source element
coreelements: concat: Concat
coreelements: capsfilter: CapsFilter
coretracers: leaks (GstTracerFactory)
coretracers: stats (GstTracerFactory)
coretracers: rusage (GstTracerFactory)
coretracers: log (GstTracerFactory)
coretracers: latency (GstTracerFactory)
(1) tee
linuxのteeと同じイメージでパイプラインを複数に分けることができます。通常、パラメータnameで名前を付けておき、後述するqueueで処理します。
$ gst-inspect-1.0 tee
Factory Details:
Rank none (0)
Long-name Tee pipe fitting
Klass Generic
Description 1-to-N pipe fitting
(略)
Element Properties:
name : The name of the object
flags: readable, writable
String. Default: "tee0"
(略)
(2) queue
queueを挟むとスレッドを分けることが出来ます。先のteeで分けられたパイプラインを、別スレッドから、引き続き処理するイメージです。
$ gst-inspect-1.0 queue
Factory Details:
Rank none (0)
Long-name Queue
Klass Generic
Description Simple data queue
(略)
2 パイプラインの分岐
通常のパイプラインは、上記のように一列縦隊で処理が進みます。そして、スレッドを分けると、前段の処理を複数の後段で続けることが出来ます。
下記は、kvssinkを別スレッドで2つ使用して、USBカメラからの入力を、それぞれ、stream1及びstream2というストリームに送っています。
$ 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 ! tee name=t ! \
queue ! kvssink stream-name=stream1 t. ! \
queue ! kvssink stream-name=stream2
そして、コンソールから2つのストリームを確認している様子です。一気に、2つのストリームに保存できていることが分かります。
作業は、環境変数で認証情報とリージョンを設定した状態で行っています。
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxx
また、デバイスはdevice=/dev/video0(v4l2srcでのデフォルト)で認識されてます。
3 最後に
実は、複数のストリームに記録する必要がある場面は、ちょっと思いついてないのですが、teeとqueueの使い方に慣れておくことは、色々な場面で応用が効くかもしれません。