web-dev-qa-db-ja.com

Gstreamerを使用してカメラからh.264ストリームをキャプチャする

_/dev/video0_ _Gstreamer 1.0_要素を使用して、ローカルにインストールされたLogitech C920カメラから_v4l2src_からH264ストリームをキャプチャしようとしています。

_v4l2-ctl --list-formats_は、カメラがH264ビデオ形式を提供できることを示しています。

_# v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
        ...

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'H264' (compressed)
        Name        : H.264

        ...
_

しかしパイプライン

_# gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! video/x-h264, width=800, height=448, framerate=30/1 ! fakesink_

not-negotiated (-4)エラーが繰り返し表示されます:

_/GstPipeline:pipeline0/GstV4l2Src:v4l2src0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstFakeSink:fakesink0.GstPad:sink: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
/GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-h264, width=(int)800, height=(int)448, interlace-mode=(string)progressive, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)30/1
ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l2src0: Internal data flow error.
Additional debug info:
gstbasesrc.c(2809): gst_base_src_loop (): /GstPipeline:pipeline0/GstV4l2Src:v4l2src0:
streaming task paused, reason not-negotiated (-4)
Execution ended after 67687169 ns.
_

助けて!

12
s.webbandit

あなたのニーズにgstreamerは必須ですか? H264モードのLogitech C920とgstreamerにも多くの問題があります。しかし、私はVLCをRTSPサーバーとして使用して、C920をH264で使用することができました。

$ cvlc -v v4l2:///dev/video0:chroma="H264":width=1024:height=570:fps=30 \
       --sout="#rtp{sdp=rtsp://:8554/live}"

次に、別のVLCでURI rtsp:// localhost:8554/liveに接続できます。

GStreamerが必須である場合、私はここで見つけることができるキャプチャユーティリティでのみ使用することができました: https://github.com/csete/bonecam -directory "capture"

コンパイルする必要がありますが、プログラミングスキルがあれば、Cファイルとスクリプトが1つしかないため、非常に簡単です。 "Host"をパラメーターとしてスクリプトに渡すだけです。

# Get the bonecam/capture content or git clone the directory, and then
$ cd bonecam/capture
$ ./build Host

「キャプチャ」ユーティリティは、次のようなもので使用できます。

$ v4l2-ctl -d /dev/video0 --set-fmt-video=width=1024,height=570,pixelformat=1
$ v4l2-ctl -d /dev/video0 --set-parm=30
$ ./bonecam/capture/capture -d /dev/video0 -c 100000 -o | \
      gst-launch -e filesrc location=/dev/fd/0 ! legacyh264parse ! rtph264pay ! udpsink Host=10.0.0.42 port=5000

取得するフレームの数を指定したくない場合(「-c」パラメーターと「capture」)、このユーティリティには次のような分岐があります。 https://github.com/ DeLaGuardo/bonecam

C920で動作する「不良」として分類されたプラグインがgstreamer 0.10のuvch264と呼ばれていることを知っています。しかし、私はgstreamer 1.0を知りませんし、テストすることもできませんでした。

UPD:

cvlcコマンドラインに--rtsp-timeout=-1を追加することを忘れないでください

$ cvlc -v v4l2:///dev/video0:chroma="H264":width=1024:height=570:fps=30 \
       --sout="#rtp{sdp=rtsp://:8554/live}" --rtsp-timeout=-1

このオプションがない場合、ストリーミングはデフォルトで60秒間しか持続しません。

11

私は同じことをやろうとしていて、同じエラーが出ました。私はGStreamer 1.0.6を使用していたと思います。

私が見つけたのは、おそらくファーガルバトラーの答えのおかげでさえ、次のページでした。

http://kakaroto.homelinux.net/2012/09/uvc-h264-encoding-cameras-support-in-gstreamer/

Youness Alaouiが、H264カメラのサポートをGStreamerにもたらすために彼が作成したuvch264_src要素について説明します。

彼はGStreamer 1.0への移植を彼の記事で保留中であると説明しています。先週、私はこれについて調査してきました。それは現在GStreamer 1.0に移植されていますが、開発者向けリリース(バージョン1.1.2)でのみです。

ここでバージョン1.1.2を取得できます。

http://gstreamer.freedesktop.org/src/

現在は「uvch264src」と呼ばれ、gst-plugins-badの一部です。バージョン1.1.1にも存在すると思いますが、実際には調べていません。

インストールに少し苦労しましたが、PCにインストールされているGST 1.0パッケージとの競合が原因であると考えられます(私自身の責任です)。ただし、libgudev-1.0-devとlibusb-1.0-0-devに依存しているため、最初にこれらのパッケージをインストールしてください。これらの2つが見つからなかったため、解決に時間がかかりました。

これは私がuvch264を使用して動作するようになったパイプラインです:

gst-launch-1.0 uvch264src device=/dev/video0 name=src auto-start=true src.vfsrc ! video/x-raw, format=YUY2, width=160, height=90, framerate=5/1 ! xvimagesink src.vidsrc ! queue ! video/x-h264, width=800, height=448, framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink

(vfsrcパッドからの)プレビュービデオを使用しない場合は、src.vfsrcをまっすぐにfakesinkにフックします。また、このパイプラインが機能しているにもかかわらず、「セグメントイベントの前にデータフローを取得する」という警告がたくさん表示されることにも触れておきます。だから私は明らかに正しいことをしていませんが、私は何をしているのかわかりません。

とにかく、1.1.2とuvch264srcが完全にインストールされて機能していることをすべて混乱させた後、v4l2srcをもう一度試してみることにしました。そして結局のところ、v4l2srcはH264を適切にサポートしていることがわかります:/。 (短い答えを参照してください。)


短い答え:

したがって、質問に対する簡単な答えは、ソースから1.1.2をインストールしてよければ、これまでと同じように、希望どおりの操作を実行できるということです。 uvch264srcは必要ありません。私はあなたのパイプラインをテストしました、そしてそれは私のインストールでうまくいきました。ビデオを画面に表示するために、この単純なパイプラインも試してみましたが、それでもうまくいきました。

gst-launch-1.0 -e v4l2src device=/dev/video0 ! video/x-h264, width=800, height=448, framerate=30/1 ! avdec_h264 ! xvimagesink sync=false

3
Adam Goodwin

また、Logitech C920カメラも用意しています。次のパイプラインを使用して、カメラからのH.264ビデオを記録しました。

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-h264,width=1280,height=720,framerate=30/1 ! mpegtsmux ! filesink location=output.ts

これは、カメラにH.264データを生成するように要求します。次に、これを MPEGトランスポートストリーム コンテナーに多重化し、ディスクに書き込みます。結果のファイルをTotemで正常に再生できます。

上記のパイプラインは720pで記録します。要求されたフォーマットをwidth=1920,height=1080に変更すると、カメラは1080pで記録することもできます。

1

ビデオをビデオシンクが理解できる形式に自動的に変換するには、videoconvertを使用してみてください

gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! videoconvert ! ...
0
Vadim Suboch

現在、v4l2srcがh264をサポートしているとは思いません。こちらをご覧ください:

http://www.oz9aec.net/index.php/gstreamer/473-using-the-logitech-c920-webcam-with-gstreamer

そしてここ:

http://kakaroto.homelinux.net/2012/09/uvc-h264-encoding-cameras-support-in-gstreamer/

0
Fergal Butler