【小ネタ】2つのWebカメラの入力を合成し、1つの動画としてKinesis Video Streamsに送信する
1 はじめに
CX事業本部の平内(SIN)です。
良くわからないタイトルになってしまってますが、こんな感じです。
- Macに2台のUSBカメラを接続して動画を撮影
- 2つの動画を横に繋いで、1つの動画として、Kinesis Video Streamsに送信する
2 videoboxとvideomixer
複数の動画を合成するには、videoboxとvideomixerを使用します。
(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 への送信
videoboxとvideomixerを使用して合成した動画を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の理解が避けられないと思いますが、慣れてくると、逆にそのパワーに圧倒される感じもあります。
偉大な先駆者に感謝しながら、色々使いまわして行きたいと思います。