【问题标题】:GStreamer API in OpenCV: autovideosink vs appsinkOpenCV 中的 GStreamer API:autovideosink 与 appsink
【发布时间】:2020-02-19 22:37:23
【问题描述】:

当我在终端上运行以下 Gstreamer Receiver 命令时,它可以正常工作。

gst-launch-1.0 -v udpsrc 端口=5004 ! 'application/x-rtp,payload=96,encoding-name=H264' ! rtpjitterbuffer 模式=1! rtph264depay! h264解析!解码器!视频转换! 自动视频接收器

我需要捕获这些帧并使用 OpenCV 的 Gstreamer API 进行一些处理。我在 C++ 代码中使用了确切的管道,但 VideoCapture 无法启动。代码如下:

#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
using namespace cv;

#include <iostream>
using namespace std;

int main()
{
    VideoCapture cap("udpsrc port=5004 ! application/x-rtp,payload=96,encoding-name=H264 ! rtpjitterbuffer mode=1 ! rtph264depay ! h264parse ! decodebin ! videoconvert ! autovideosink", CAP_GSTREAMER);
    
    if (!cap.isOpened()) {
        cerr <<"VideoCapture not opened"<<endl;
        exit(-1);
    }
    
    while (true) {

        Mat frame;

        cap.read(frame);

        imshow("receiver", frame);

        //  Process the frame.

        if (waitKey(1) == 27) {
            break;
        }
    }

    return 0;
}

当我尝试编译和运行时,我收到:

(Receiver_Teal:2292): GStreamer-CRITICAL **: gst_element_get_state: 断言“GST_IS_ELEMENT(元素)”失败

VideoCapture 未打开

【问题讨论】:

    标签: opencv c++14 ubuntu-16.04 gstreamer video-capture


    【解决方案1】:

    尝试用appsink替换末尾的autovideosink

    VideoCapture cap("udpsrc port=5004 ! application/x-rtp,payload=96,encoding-name=H264 ! rtpjitterbuffer mode=1 ! rtph264depay ! h264parse ! decodebin ! videoconvert ! appsink", CAP_GSTREAMER);
    

    【讨论】:

    • 这实际上解决了我的问题。你能添加你的答案为什么它有效吗?我不明白为什么 autovideosink 可以在命令行提示符下工作,但不能在 C++ 代码中工作。
    • 当您为 OpenCV 提供自定义管道时,库需要能够从该管道中提取帧并将其提供给您。 appsink 元素使这些帧可用于 OpenCV,而 autovideosink 只是在屏幕上的窗口中显示这些帧。出于这个原因,您为 OpenCV 提供的每个自定义管道都需要有一个 appsink 元素。
    猜你喜欢
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2014-06-23
    • 2015-09-21
    相关资源
    最近更新 更多