使用VideoWriter从OpenCV打开GStreamer管道

我使用OpenCV捕捉和处理视频帧,并且我想将它们编写为h265视频文件。 我正努力从OpenCV获得一个合适的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 writern");
   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);

其结果是:

(测试:5533):GStreamer-CRITICAL **:gst_element_make_from_uri:声明'gst_uri_is_valid(uri)'失败OpenCV错误:未指定错误(GStreamer:无法在手动管道中找到appsrc)在CvVideoWriter_GStreamer :: open,file / home / ubuntu / opencv /modules/videoio/src/cap_gstreamer.cpp,第1363行VIDEOIO(cvCreateVideoWriter_GStreamer(filename,fourcc,fps,frameSize,is_color)):引发OpenCV异常:

/home/ubuntu/opencv/modules/videoio/src/cap_gstreamer.cpp:1363:错误:(-2)GStreamer:在手动管道中找不到appsrc CvVideoWriter_GStreamer :: open

我也试过简单的:

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

这产生:

GStreamer插件:嵌入式视频播放暂停; 模块appsrc0报告:内部数据流错误。

我正在使用OpenCV 3.1和Gstreamer支持。 硬件是带L4T 24.2.1的Jetson TX1。


我之前遇到过类似的问题。 由于管道/文件名以.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);
链接地址: http://www.djcxy.com/p/25433.html

上一篇: Opening a GStreamer pipeline from OpenCV with VideoWriter

下一篇: Segmentation fault OpenCV cap.read udp stream Python