1. 概要
Raspberry Pi Zeroを使ってAmazon Kinesis Video Streamsに送信したカメラ映像をWebブラウザで再生していると停止してしまう現象を調べる。ついでに、フレームレートが指定通りでないように見える件も調べる。
2. 前置き
前の記事でKinesis Video Streams(KVS)にカメラ映像を送信できることを確認した。この方法を確かめた知人が2時間くらいクライアントで映像再生していると停止してしまうと連絡があり確かめることにした。また、フレームレートが安定していないとも言っていた。
前記事
2.1 使用機器
- Raspberry Pi Zero WH
OSはBuster(Debian 10) - UVCカメラ: Buffalo BSW500M
- USB HUB(カメラ以外にキーボードやマウスをつなぐ場合)
- 再生用クライアント(これは知人が指定してきた)
https://aws-samples.github.io/amazon-kinesis-video-streams-media-viewer/
3. 映像再生が停止するか確認
まずは、前記事の方法でKVSにカメラ映像をアップロード開始する。次に、再生用クライアントをWebブラウザで起動する。指定するのは、
- Region ← aws-regionの値
- AWS Access Key ← access-keyの値
- AWS Secret Key ← secret-keyの値
- Stream name ← stream-nameの値
これらはアップロード時のコマンド(下記参照)内にある
$ gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! video/x-raw,format=I420,width=640,height=480 ! omxh264enc control-rate=2 target-bitrate=512000 periodicity-idr=45 inline-header=FALSE ! h264parse ! video/x-h264,stream-format=avc,alignment=au,profile=baseline ! kvssink stream-name="MyKinesisVideoStream" access-key="<アクセスキー>" secret-key="<シークレットアクセスキー>" aws-region="ap-northeast-1"
そして、ページ下部にある「Start Playback」をクリックすると、再生開始する。
そして、5分で再生停止した・・・
4. 原因調査
4.1. クライアント側の情報
WebブラウザにはEdgeを使用した。F12で開発者ツールを使用した以下を確認した。これを見るとサーバー側の問題に見える。
4.2. マスター側(カメラ)の確認
エラーはなかったが、以下の警告が出ていた。タイムスタンプの問題?
[WARN ] [15-05-2022 05:11:34:192.582 GMT] putKinesisVideoFrame(): Failed to submit frame to Kinesis Video client. status: 0x32000002 decoding timestamp: 17951451 presentation timestamp: 16525914943046922
5. 対策
5.1. マスター側で「Failed to submit frame ~」が
kvssinkのパラメータを調べた
https://docs.aws.amazon.com/ja_jp/kinesisvideostreams/latest/dg/examples-gstreamer-plugin-parameters.html
どうやら以下が使用できることが分かった。UVCカメラのフレームにはタイムスタンプがなかったのかも?
frame-timecodes=false
5.2. クライアント側でStreaming session token is expired
最初は。ブラウザにある「AWS Session Token (Optional)」かなと思ったが、「Expires (seconds)」の項目だと分かった。
ここがからの場合、自分の環境では5分で再生停止したが、1800にすると30分で再生停止し、7200ににすると2時間で再生停止した。勝手に停止してしまう原因はここで間違いにだろう。デフォルトが5分なのか?
5.3. フレームレートが安定しない
再生映像を見ていると確かに一定していない気がする。マスター側のコマンドをよく見るとフレームレート設定していないが、それとは別にkvsのパラメータにframerateがあることも気が付いた。
以下のように設定すると再生映像が心なしか安定したようだ。
framerate=30
6. 結論
上記の結果を知人に連絡したところ、再生停止はしなくなり、フレームレートも安定したように見えるとのことだ。ちなみ教わったクライアントではなく自作クライアントらしい。再現できていなかったかもしれんので、そこは言っておいてほしかったねー。
【まとめ】
- マスター側でWarningが出るなら、「frame-timecodes=false」はあった方がよい。
- 24時間365日見続けるつもりがないなら、「Expires (seconds)」で再生する時間を指定した方がよい。
- フレームレートはkvsのパラメータだけでなく、入力側も設定した方がおそらく良い。
こんな感じ「video/x-raw,width=640,height=480,framerate=30/1」
以上