9

着信ビデオが RTP 経由で H264 である v4l2loopback を使用して、Chrome で仮想カメラを作成しようとしています。

GStreamer テスト ビデオを Chrome で認識させることに成功しましたMediaStreamTrack.getSources

$ sudo modprobe v4l2loopback
$ gst-launch-1.0 videotestsrc ! v4l2sink device=/dev/video0

これで問題なく動作し、Chrome にビデオ テスト ソースが表示されます。

ただし、着信 h264/RTP ソースを使用すると、デバイスが に表示されませんMediaStreamTrack.getSources。例えば:

gst-launch-1.0 -v tcpclientsrc host=<IPADDRESS> port=5000  ! gdpdepay !  rtph264depay ! avdec_h264 ! videoconvert ! v4l2sink device=/dev/video0

これの理由は何ですか?解決策は何ですか?

おそらくこれはビデオ形式に関係しており、v4l2loopback を介して正しいキャップを設定する必要があると考えていました。

4

1 に答える 1

5

これは 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に供給しているようですが、ゼロ フレーム レートを認識していません。 (これはあくまでも仮説ですので、実際にそうなるかどうかはまだ確認が必要です。)v4l2loopbackv4l2loopback

このバグを回避するには、フレーム レートを修正します。videorate最初のパイプラインに要素を追加するだけです:

$ gst-launch-1.0 -v tcpserversrc port=5000 \
    ! gdpdepay ! rtph264depay \
    ! decodebin \
    ! videorate ! video/x-raw, framerate=25/1 \
    ! v4l2sink device=/dev/video0
于 2014-03-26T10:55:35.007 に答える