2

これは機能します:

gst-launch -e v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1 ! tee name=splitter ! queue ! autovideosink splitter. ! queue ! theoraenc ! oggmux ! filesink location=testogg.ogg

私はPythonとpygstを使用して動的な方法で同じことをしようとしています.autovideosinkブランチは常にそこにあり、ユーザー入力の後、filesinkを添付したいと思います.

これは動的接続コードです。

    fileSink = self.getFileSink()
    pad = fileSink.get_static_pad('sink')
    pad.set_blocked_async(True, self.padBlockedOnRecordStart, None)
    self.player.add(fileSink)
    fileSink.set_state(gst.STATE_PLAYING)
    self.player.get_by_name('splitter').link(fileSink)
    pad.set_blocked_async(False, self.padBlockedOnRecordStart, None)

リンクすると、次のエラーが発生します。

Error: GStreamer encountered a general stream error. gstbasesrc.c(2625): gst_base_src_loop (): /GstPipeline:player/GstV4l2Src:video:
streaming task paused, reason not-negotiated (-4) 

何か案は?

4

2 に答える 2

2

今それは動作します!. 解決策は、capsfilter に「フォーマット」を追加することでした。以前のキャップ フィルタ文字列は次のとおりです。

caps = gst.Caps('video/x-raw-yuv,width=640,height=480,framerate=30/1')

そして今は次のとおりです。

caps = gst.Caps('video/x-raw-yuv,format=(fourcc)I420,width=640,height=480,framerate=30/1')

問題は、ウェブカメラのデフォルトの出力ピクセル形式が「YUYV」であり、fileSink Bin の theoraenc 要素がこの形式を受け入れなかったため、追加することで解決しformat=(fourcc)I420ました。以前の capsfilter 文字列が gst-launch で機能した理由はまだわかりませんが、今は気にしません。手伝ってくれてありがとう

于 2013-09-03T19:30:38.147 に答える