2017-04-14 439 views
0

私はOpenCVでビデオフレームをキャプチャして処理していますので、h265ビデオファイルとして書きたいと思います。私は、OpenCVから適切なGstreamerパイプラインを取得するために苦労しています。OpenCVからVideoWriterでGStreamerパイプラインを開く

Gstreamerは単独で動作します。特に、私は(GPUアクセラレーションのおかげで)非常に迅速にビデオをエンコードしている、このコマンドを実行することですし、MKVファイルに保存します:

gst-launch-1.0 videotestsrc num-buffers=90 ! 'video/x-raw, format=(string)I420, width=(int)640, height=(int)480' ! omxh265enc ! matroskamux ! filesink location=test.mkv 

今、私はOpenCVの中から同じことをしたいと思います応用。私のコードのようなものです:一見

Mat img_vid = Mat(1024, 1024, CV_8UC3); 

VideoWriter video; 
video.open("appsrc ! autovideoconvert ! omxh265enc ! matroskamux ! filesink location=test.mkv", 0, (double)25, cv::Size(1024, 1024), true); 

if (!video.isOpened()) { 
    printf("can't create writer\n"); 
    return -1; 
} 

while (...) { 

    // Capture frame into img_vid => That works fine 

    video.write(img_vid); 

    ... 
} 

、これが動作しているようですが、何それがないと、それは"appsrc ! autovideoconvert ! omxh265enc ! matroskamux ! filesink location=test.mkv"という名前のファイルを作成し、非圧縮のビデオフレームでそれを埋め、は完全にこれがあるという事実を無視していますGstreamerパイプライン

私は他のパイプラインを試してみましたが、彼らはさまざまなエラーが発生:

video.open("appsrc ! autovideoconvert ! omxh264enc ! 'video/x-h264, streamformat=(string)byte-stream' ! h264parse ! qtmux ! filesink location=test.mp4 -e", 0, (double)25, cv::Size(1024, 1024), true); 

になり:

(Test:5533): GStreamer-CRITICAL **: gst_element_make_from_uri: assertion 'gst_uri_is_valid (uri)' failed OpenCV Error: Unspecified error (GStreamer: cannot find appsrc in manual pipeline) in CvVideoWriter_GStreamer::open, file /home/ubuntu/opencv/modules/videoio/src/cap_gstreamer.cpp, line 1363 VIDEOIO(cvCreateVideoWriter_GStreamer(filename, fourcc, fps, frameSize, is_color)): raised OpenCV exception:

/home/ubuntu/opencv/modules/videoio/src/cap_gstreamer.cpp:1363: error: (-2) GStreamer: cannot find appsrc in manual pipeline in function CvVideoWriter_GStreamer::open

は私もシンプルを試してみました:

video.open("appsrc ! autovideosink", 0, (double)25, cv::Size(1024, 1024), true); 

GStreamer Plugin: Embedded video playback halted; module appsrc0 reported: Internal data flow error.

私はOpenCV 3.1をGstreamerでサポートしています。ハードウェアは、L4T 24.2.1のJetson TX1です。

答えて

5

前にも同様の問題が発生しました。パイプ/ファイル名は.mkvで終わるので、OpenCVはそれをパイプではなくビデオファイルとして解釈します。

あなたはそれが動作するmkv

video.open("appsrc ! autovideoconvert ! omxh265enc ! matroskamux ! filesink location=test.mkv ", 0, (double)25, cv::Size(1024, 1024), true); 

または

video.open("appsrc ! autovideoconvert ! omxh265enc ! matroskamux ! filesink location=test.mkv sync=false", 0, (double)25, cv::Size(1024, 1024), true); 
+0

のようなダミーの財産とした後のようにダミーの間隔でそれを終了してみてください!!!!ああ、ありがとう。私はこれに非常に多くの時間を費やして、何が間違っていたのか分からなかった... –

+0

こんにちは! RTMPパイプラインにイメージを書き込む/プッシュするにはどうしたらいいですか? –

+0

これは私のためには機能しませんでした。末尾に空白やダミープロパティがあるかどうか(GStreamer 1.12.4、Mac OSX 10.13.3)、Gstreamerパイプライン全体の名前をファイルに書き込みます。 –

関連する問題