4

Logitech C920 ウェブカメラから未加工のビデオをストリーミングし、GStreamer 1.0 を使用してビデオの表示とファイルへの保存の両方を行いたいと考えています。

これは、カメラから h264 でエンコードされたビデオをストリーミングすると機能しますが (カメラはハードウェアでエンコードされた h264 を提供します)、カメラから未加工のビデオをストリーミングすると失敗します。ただし、表示するだけ、またはファイルに保存するだけの場合、生のビデオのストリーミングは機能します。

h264 ビデオ ストリームでは機能するのに、生のビデオ ストリームでは機能しないのはなぜですか?

カメラからディスプレイとファイルの両方へのh264でエンコードされたビデオストリーム(WORKS):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-h264,width=640,height=480,framerate=15/1 ! tee name=t \
    t. ! queue ! h264parse ! avdec_h264 ! xvimagesink sync=false \
    t. ! queue ! h264parse ! matroskamux \
    ! filesink location='h264_dual.mkv' sync=false

カメラからディスプレイのみへの raw ビデオ ストリーム (WORKS):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! xvimagesink sync=false

カメラからファイルのみへの raw ビデオ ストリーム (WORKS):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! videoconvert ! x264enc ! matroskamux \
    ! filesink location='raw_single.mkv' sync=false

カメラからディスプレイとファイルの両方への raw ビデオ ストリーム (失敗):

gst-launch-1.0 -v v4l2src device=/dev/video0 \
    ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \
    ! tee name=t \
    t. ! queue ! xvimagesink sync=false \
    t. ! queue ! videoconvert ! x264enc ! h264parse ! matroskamux \
    ! filesink location='raw_dual.mkv' sync=false

最後のコマンド (ディスプレイとファイルの両方への生のビデオ) は、警告やエラーなしで失敗します。gst-launch 端末の出力は、ファイルへの書き込みのみの場合とまったく同じです。xvimage ウィンドウが表示され、カメラからの画像が表示されますが、画像は変化しません (つまり、フリーズします)。ゼロ バイトのファイルも表示されます。

上記のコマンドの複数のバージョンを試しましたが、それらは問題を再現できる最小限のコマンドだと思います。

誰かが私が間違っていることを理解していますか?

4

1 に答える 1

4

Web カメラ (C920 に固有ではない) から生のビデオをディスプレイと h.264 エンコード ファイルの両方にストリーミングできます。x264encプロパティを に設定するtune必要がありますzerolatency

h.264 の例:

gst-launch-1.0 -v v4l2src device=/dev/video0 \ ! video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 \ ! tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! x264enc tune=zerolatency ! h264parse ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

または、h.264 を完全にスキップして、代わりに theora または vp8 にエンコードすることもできます。

理論の例:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! \ video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 ! \ tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! theoraenc ! theoraparse ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

vp8 の例:

gst-launch-1.0 -v v4l2src device=/dev/video0 ! \ video/x-raw,format=YUY2,width=640,height=480,framerate=15/1 ! \ tee name=t t. ! queue ! xvimagesink sync=false t. ! queue ! \ videoconvert ! vp8enc ! \ matroskamux ! filesink location='raw_dual.mkv' sync=false

Jan Spurny と Tim に感謝します。

于 2015-03-26T17:21:54.710 に答える