gpt4 book ai didi

c++ - 使用 VideoWriter 从 OpenCV 打开 GStreamer 管道

转载 作者:太空宇宙 更新时间:2023-11-04 15:13:40 28 4
gpt4 key购买 nike

我正在使用 OpenCV 捕获和处理视频帧,我想将它们写成 h265 视频文件。我正在努力让合适的 Gstreamer 管道在 OpenCV 中工作。

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 !auto​​videoconvert !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.

我正在使用支持 Gstreamer 的 OpenCV 3.1。硬件是带有 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);

关于c++ - 使用 VideoWriter 从 OpenCV 打开 GStreamer 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412797/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com