これは gstreamer または v4l2loopback のバグのようです。これは、可変フレーム レートの処理方法に何らかの関係があります。
私はこの方法でそれを再現することができました:
ネットワークからビデオを送信するパイプラインを開始します/dev/video0
$ gst-launch-1.0 -v tcpserversrc port=5000 \
! gdpdepay ! rtph264depay \
! decodebin \
! v4l2sink device=/dev/video0
ビデオをポート 5000 に送信するパイプラインを開始する
$ gst-launch-1.0 -v videotestsrc \
! x264enc ! rtph264pay ! gdppay \
! tcpserversink port=5000
からビデオを取得してみてください/dev/video0
$ gst-launch v4l2src device=/dev/video0 ! autovideosink
...
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Device '/dev/video1' is not a capture device.
v4l2sink
ここで、最初のパイプラインのデバッグ ログのcaps に注意してください。
/GstPipeline:pipeline0/GstV4l2Sink:v4l2sink0.GstPad:sink: caps = video/x-raw, format=(string)I420, width=(int)320, height=(int)240, pixel-aspect-ratio=(fraction)1/1, interlace-mode=(string)progressive, colorimetry=(string)bt601, framerate=(fraction)0/1
それは言及していframerate=(fraction)0/1
ます。gstreamer の用語では、これはフレーム レートが可変であることを意味します。のソース コードによると、これと同じフレーム レートをカーネル モジュールv4l2sink
に供給しているようですが、ゼロ フレーム レートを認識していません。
(これはあくまでも仮説ですので、実際にそうなるかどうかはまだ確認が必要です。)v4l2loopback
v4l2loopback
このバグを回避するには、フレーム レートを修正します。videorate
最初のパイプラインに要素を追加するだけです:
$ gst-launch-1.0 -v tcpserversrc port=5000 \
! gdpdepay ! rtph264depay \
! decodebin \
! videorate ! video/x-raw, framerate=25/1 \
! v4l2sink device=/dev/video0