【小ネタ】2つのWebカメラの入力を合成し、1つの動画としてKinesis Video Streamsに送信する

2020.02.23

1 はじめに

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

良くわからないタイトルになってしまってますが、こんな感じです。

  • Macに2台のUSBカメラを接続して動画を撮影

  • 2つの動画を横に繋いで、1つの動画として、Kinesis Video Streamsに送信する

2 videoboxとvideomixer

複数の動画を合成するには、videoboxvideomixerを使用します。

(1) videobox

videoboxは、境界線を追加したり、トリミングしてビデオのサイズを変更するフィルターです。


https://thiblahute.github.io/GStreamer-doc/videobox-1.0/index.html?gi-language=c

videobox border-alpha=0 left=-640 

などとすることで、動画を右に640ズラすことになります。今回は、この要領で、1つ目の入力を右にズラしておいて、その部分で2つ目の動画を合成しています。

(2) videomixer

videomixerは、AYUV、ARGB、BGRAのビデオストリームを受け入れ、出力を生成します。


https://gstreamer.freedesktop.org/documentation/videomixer/index.html?gi-language=c

下記のようにパイプラインに追加することで、後段で、名前(ここではmix)に対して、ビデオを追加できます。

videomixer name=mix 

3 kvssink への送信

videoboxvideomixerを使用して合成した動画をKinesis Video Streamsに送るコマンドは以下のようになります。

$ gst-launch-1.0 avfvideosrc device-index=1 ! videoconvert ! \
video/x-raw,width=640,height=480 ! videobox border-alpha=0 left=-640 ! \
videomixer name=mix ! videoconvert ! vtenc_h264_hw allow-frame-reordering=FALSE \
realtime=TRUE max-keyframe-interval=45 bitrate=512 ! h264parse ! \
video/x-h264,stream-format=avc,alignment=au,profile=baseline ! \
kvssink stream-name=sampleStream avfvideosrc device-index=2 ! \
videoconvert ! video/x-raw,width=640,height=480 ! mix.

! kvssink stream-name=sampleStream の所までが、前段部分で、その後は、前段に仕込んだ、videomixerに動画を追加しているイメージです。

h.264のエンコードなどは、前段の処理として記述され、2回書く必要はありません。

作業は、環境変数で認証情報とリージョンを設定した状態で行っています。

export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxx

4 最後に

ここ数日、GStreamerと格闘してきましたが、なんとなく雰囲気が掴めてきたような気がします。 Kinesis Video Streamsのプロデューサーが、GStreamerのシンクで実装されている以上、思い通りに送信するにはGStreamerの理解が避けられないと思いますが、慣れてくると、逆にそのパワーに圧倒される感じもあります。

偉大な先駆者に感謝しながら、色々使いまわして行きたいと思います。