Как использовать Opencv VideoWriter с GStreamer? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь передать поток h264 с помощью Opencv VideoWriter, чтобы передать его на другой p c в сети с помощью VideoCapture. Тем не менее, я застрял на VideoWriter. Выполнение этого кода возвращается с ошибкой, и out.isOpened () всегда ложно.

    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.

    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 () говорит:

    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

1 Ответ

0 голосов
/ 27 апреля 2020

Вам нужно подать сырое видео на appsrc. Установка fourcc в h264 заставляет VideoWriter кодировать видео вместо gstreamer pipe. Вы можете установить fourcc в 0 в pu sh необработанное видео. Следующее должно работать.

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);
...