2017-04-14 24 views
0

OpenCV로 비디오 프레임을 캡쳐하고 처리 중이므로 h265 비디오 파일로 작성하고 싶습니다. 나는 OpenCV에서 작동하도록 적절한 Gstreamer 파이프 라인을 얻으려고 고심하고있다.OpenCV에서 VideoWriter로 GStreamer 파이프 라인 열기

Gstreamer는 단독으로 작동합니다.

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에서 같은 일을하고 싶습니다 특히, 나는 (덕분에 GPU 가속에) 매우 신속하게 비디오를 인코딩하고 MKV 파일에 저장이 명령을 실행 할 수 있어요 신청. 내 코드는 같은 것입니다 : 첫눈에서

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 파이프 라인 인 파일에 계속 쓰고 있습니다 (GStreamer 1.12.4, Mac OSX 10.13.3). –

관련 문제