_/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.
_
助けて!
あなたのニーズに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秒間しか持続しません。
私は同じことをやろうとしていて、同じエラーが出ました。私は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
また、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で記録することもできます。
ビデオをビデオシンクが理解できる形式に自動的に変換するには、videoconvertを使用してみてください
gst-launch-1.0 -vvv v4l2src device=/dev/video0 ! videoconvert ! ...
現在、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/