我使用OpenCV捕获和处理视频帧,我想将它们编写为h265视频文件。我正努力从OpenCV获得一个合适的Gstreamer管道。使用VideoWriter从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 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。
它的工作原理虚拟财产的结局吧!!!!哦,男人,非常感谢你。我在这上面花了很多时间,不知道有什么问题...... –
嗨,先生!我如何将图像写入/推送到RTMP管道,而不是文件? –
这不适合我。它仍然写入一个文件,该文件的名称是整个Gstreamer管道,无论末端是否有空格或虚拟属性(GStreamer 1.12.4,Mac OSX 10.13.3)。 –