いくつかのopencvプロセスをgstreamerパイプラインに追加し、それをudpsink経由で送信したいとします。gstreamerパイプラインにopencv matを書き込む方法は?
私はこのようなのgstreamerからフレームを読むことができるよ:
// may add some plugins to the pipeline later
cv::VideoCapture cap("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! videoconvert ! appsink");
cv::Mat frame;
while(ture){
cap >> frame;
// do some processing to the frame
}
しかし、何を把握することはできませんするには、次のパイプラインに処理されたフレームを渡す方法です:appsrc ! x264enc ! mpegtsmux ! udpsink host=localhost port=5000
私はしました
cv::VideoWriter writer = cv::VideoWriter("appsrc ! x264enc ! mpegtsmux ! udpsink host=localhost port=5000", 0, (double)30, cv::Size(640, 480), true);
writer << processedFrame;
を試してみましたが、受信側では何も受信しません。 (私は受信機として$gst-launch-1.0 udpsrc port=5000 ! tsparse ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! ximagesink sync=false
パイプラインを使用します)
私の質問は、私はgstreamerパイプラインに処理されたopencv Matを渡して、何らかのエンコーディングをさせてから、udpsinkでネットワーク経由で送信できますか?「はい」の場合、これをどのように達成できますか?
私はVideoWriterをデバッグする方法はありますか?フレームが実際に書き込まれているかどうかのチェックなど。
私は、ubuntu 14.04でopencv 2.4.12とgstreamer 1.2を使用しています。
どのようなヘルプも素晴らしいです!
EDIT: の詳細情報を提供するために、私は次のコードをテストし、それがどうやらそこappsrcパイプラインと間違って何かがありますが、私はので、何が悪かったのか見当がつかないGStreamer Plugin: Embedded video playback halted; module appsrc0 reported: Internal data flow error.
#include <stdio.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
int main(int argc, char *argv[]){
cv::VideoCapture cap("v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! videoconvert ! appsink");
if (!cap.isOpened()) {
printf("=ERR= can't create capture\n");
return -1;
}
cv::VideoWriter writer;
// problem here
writer.open("appsrc ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! autovideoconvert ! ximagesink sync=false", 0, (double)30, cv::Size(640, 480), true);
if (!writer.isOpened()) {
printf("=ERR= can't create writer\n");
return -1;
}
cv::Mat frame;
int key;
while (true) {
cap >> frame;
if (frame.empty()) {
printf("no frame\n");
break;
}
writer << frame;
key = cv::waitKey(30);
}
cv::destroyWindow("video");
}
を与えましたパイプラインgst-launch-1.0 v4l2src ! video/x-raw, framerate=30/1, width=640, height=480, format=RGB ! videoconvert ! ximagesink sync=false
は正常に動作します。
appsrc要素に適切な上限を設定する必要があります(機能 - appsrcの引数はcapsと呼ばれます) - どの形式が 'processedFrame'ですか? – nayana
私はappsrcにsourceと同じ 'video/x-raw、frameerate = 30/1、width = 640、height = 480、format = RGB'を設定しようとしましたが、動作しませんでした。 gstreamerの大文字のopencv Matのフォーマットを調べる方法はありますか? – j0e1in