はじめに
先日、ジャンク品のWEBカメラを手に入れたので、手元にあったラズパイに接続して遊んでみようと思い、その過程で「GStreamer」を使ってみました。
その時に小一時間ハマった事がありましたので、ここにまとめておきたいと思います。
環境
- ラズパイ 3 Model B+
- Raspbian GNU/Linux 10 (buster))
- GStreamer 1.14.4
- WEBカメラ(300円のジャンク品)
ハマった事
以下のコマンドはWEBカメラの映像を画面に表示するコマンドで、このコマンドを実行するだけで、カメラの映像を画面に表示することができます。
※WEBカメラでGStreamerの公式サイトのトップページを撮影している際のスクリーンショットです。
gst-launch-1.0 v4l2src ! videoconvert ! ximagesink
そして、例えば、任意のサイズやフレームレートでキャプチャを行いたい場合は、video/x-raw,width=1280,height=720,framerate=30/1
のような指定を行います。
gst-launch-1.0 v4l2src ! videoconvert ! video/x-raw,width=1280,height=720,framerate=30/1 ! ximagesink
ただし、サイズやフレームレートを指定する場合、当然ではありますが、そのWEBカメラが対応している値を指定する必要があり、カメラが対応していない値を指定した場合はエラーとなります。
具体的に言うと、今回手に入れたWEBカメラは最大解像度が 640x480 なのですが、それを把握せずに上記のように 1280x720 でキャプチャしようとしたため、エラーになっていました。
以下のようなエラーメッセージが表示されるのですが、サイズ指定が原因だとは気づかず、小一時間ハマってしまいました。。
$ gst-launch-1.0 v4l2src ! videoconvert ! video/x-raw,width=1280,height=720,framerate=30/1 ! ximagesink
パイプラインを一時停止 (PAUSED) にしています...
Pipeline is live and does not need PREROLL ...
パイプラインを再生中 (PLAYING) にしています...
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data stream error.
追加のデバッグ情報:
gstbasesrc.c(3055): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
streaming stopped, reason not-negotiated (-4)
Execution ended after 0:00:00.000240937
パイプラインを一時停止 (PAUSED) にしています...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
最後に
とりあえず、GStreamer で(上記みたいな)streaming stopped, reason not-negotiated (-4)
エラーが表示される場合は、サイズやフレームレートの指定を確認してみると良いかも知れません。
今回手に入れたWEBカメラ、調べてみたら2008年頃に発売開始されたものらしく、既に販売終了になっているようです。
カメラが古すぎて、(今では当たり前に対応しているであろう)1280x720 に対応していなかったというオチでした。