12

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

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.

どんな助けでも!

4

5 に答える 5

13

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

$ 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 つしかないため、プログラミングのスキルがあれば非常に簡単です。「ホスト」をパラメーターとしてスクリプトに渡すだけです。

# 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

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

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

更新:

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

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

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

于 2013-04-08T11:54:39.717 に答える
3

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

おそらくFergal Butlerの回答のおかげで、私が見つけたのは次のページでした:

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 に依存しているため、最初にこれらのパッケージをインストールすることに注意してください。

これは、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

于 2013-07-23T09:44:00.460 に答える
1

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 トランスポート ストリームコンテナーに多重化し、ディスクに書き込みます。結果のファイルをトーテムで正常に再生できます。

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

于 2017-09-05T02:34:21.810 に答える