如何在GStreamer中使用Opencv

如何在GStreamer中使用Opencv

本文介绍了如何在GStreamer中使用Opencv VideoWriter?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Opencv VideoWriter传输h264流,以使用VideoCapture在网络上的另一台PC上获取它.但是,我被困在VideoWriter上.该代码的执行将返回错误,并且out.isOpened()始终为false.

I am trying to transfer a h264 stream using Opencv VideoWriter to get it on another pc on the network using VideoCapture. However, I am stuck on VideoWriter. Execution of this code returns with an error and out.isOpened () is always false.

    int FOURCC = cv::VideoWriter::fourcc('H', '2', '6', '4');
    cv::VideoWriter out;
    out.open ("appsrc ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5000",
        cv::CAP_GSTREAMER,
        FOURCC,
        16,
        cv::Size (640, 480),
        true);

    if (!out.isOpened ()) {
        qDebug () << "\ n ***** Failed to open videowriter *****";
        return -1;
    }

[ WARN:0] global D:\Libs\opencv-4.3.0\modules\videoio\src\cap_gstreamer.cpp (1274) cv::CvVideoWriter_GStreamer::close_ OpenCV | GStreamer warning: No source in GStreamer pipeline. Ignore
[ERROR:0] global D:\Libs\opencv-4.3.0\modules\videoio\src\cap.cpp (527) cv::VideoWriter::open VIDEOIO(GSTREAMER): raised OpenCV exception:
OpenCV(4.3.0) D:\Libs\opencv-4.3.0\modules\videoio\src\cap_gstreamer.cpp:144: error: (-215:Assertion failed) ptr in function 'cv::`anonymous-namespace'::GSafePtr<struct _GstElement>::get'

***** Failed open videowriter *****

即使是一个简单的示例,也会向我返回错误,而out.isOpened()为false.

Even a simple example returns me an error and out.isOpened() false.

    out.open("autovideosrc ! videoconvert ! appsink",
             cv::CAP_GSTREAMER,
             FOURCC,
             16,
             cv::Size(640, 480),
             true);

[ WARN:0] global D:\Libs\opencv-4.3.0\modules\videoio\src\cap_gstreamer.cpp (1500) cv::CvVideoWriter_GStreamer::open    OpenCV | GStreamer warning: OpenCV backend does not support this file type (extension): autovideosrc ! videoconvert !   appsink
[ WARN:0] global D:\Libs\opencv-4.3.0\modules\videoio\src\cap_gstreamer.cpp (1274) cv::CvVideoWriter_GStreamer::close_  OpenCV | GStreamer warning: No source in GStreamer pipeline. Ignore

    ***** Failed to open videowriter *****

opencv 4.3.0的版本是从具有gstreamer支持的源代码编译而来的.cv :: getBuildInformation()说:

The version of opencv 4.3.0 is compiled from source code with gstreamer support.cv::getBuildInformation () says:

    Video I/O:
      DC1394: NO
      FFMPEG: YES (prebuilt binaries)
        avcodec: YES (58.54.100)
        avformat: YES (58.29.100)
        avutil: YES (56.31.100)
        swscale: YES (5.5.100)
        avresample: YES (4.0.0)
      GStreamer: YES (1.16.2)
      DirectShow: YES
      Media Foundation: YES
        DXVA: YES

如何流式传输流?VideoWriter应该指定哪些参数?我尝试了Google的各种技巧,但没有一个对我有帮助.我将很高兴看到一个简单的示例,该示例如何从一侧的VideoWriter发送流,而从另一侧的VideoCapture接收流.我正在使用Windows 10 x64和Qt5.13 MSVC2017

How can I stream the stream? What parameters should be specified by VideoWriter? I tried various tips from google, but none of them helped me. I would be grateful for a simple example of how to send a stream from VideoWriter on one side and receive it from VideoCapture on the other.I am using Windows 10 x64 and Qt5.13 MSVC2017

推荐答案

您需要将原始视频提供给 appsrc .将 fourcc 设置为 h264 会强制 VideoWriter 对视频进行编码,而不是对gstreamer管道进行编码.您可以将 fourcc 设置为0,以推送原始视频.以下应该起作用.

You need to feed raw video to appsrc. Setting fourcc to h264 forces VideoWriter to encode video instead of gstreamer pipe. You can set your fourcc to 0 to push raw video. The following should work.

cv::VideoWriter out;
out.open ("appsrc ! videoconvert ! x264enc tune=zerolatency bitrate=500 speed-preset=superfast ! rtph264pay ! udpsink host=127.0.0.1 port=5000",
    cv::CAP_GSTREAMER,
    0,
    16,
    cv::Size (640, 480),
    true);

这篇关于如何在GStreamer中使用Opencv VideoWriter?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-30 17:32