OpenCV RTP-Stream с FFMPEG - PullRequest
       3

OpenCV RTP-Stream с FFMPEG

1 голос
/ 04 февраля 2020

Я использую OpenCV с ffmpeg (api-preference CAP_FFMPEG), чтобы получить RTP-поток и показать видео.

Когда я отправляю короткое видео, оно воспроизводится, как и ожидалось. Но когда я пытаюсь отправить второе видео, второе не отображается вообще.

Мой код:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <stdlib.h>

using namespace std;
using namespace cv;
int main(int argc, char** argv) {

    cout << "--- OpenCV Verson: " << CV_VERSION << " ---" << endl;

    char env[] = "OPENCV_FFMPEG_CAPTURE_OPTIONS=protocol_whitelist;file,rtp,udp";
    int rc = putenv(env);
    if (rc != 0){
        cout << "Could not set environment variables\n" << endl;
    }

    VideoCapture cap;
    char input[] = "path/to/saved_sdp_file.sdp";
    cap.open(input, CAP_FFMPEG);
    if(!cap.isOpened()) {
        cout << "Could not open Stream" << endl;
        return 1;
    }

    string windowName = "Test";
    namedWindow(windowName, cv::WindowFlags::WINDOW_NORMAL);
    Mat frame;

    while(1){

        cap >> frame;
        if (frame.empty()){
            cout << "Application closed due to empty frame" << endl;
            return 1;
        }

        imshow(windowName, frame);
        int c = waitKey(1);
        if (c == 27){
            break;
        }
    }

    cap.release();
    destroyAllWindows();
    return 0;
}

Мой файл .sdp:

SDP:
v=0
o=- 0 0 IN IP4 127.0.0.1
s=No Name
c=IN IP4 127.0.0.1
t=0 0
m=video 6005 RTP/AVP 96
b=AS:132
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QADazZQUH7ARAAAAMAEAAAAwPA8UKZYA==,aOvjyyLA; profile-level-id=64000D

Команда для запуска потока:

ffmpeg -re -thread_queue_size 4 -i video_file.mp4 -strict -2 -vcodec copy -an -f rtp rtp://192.168.20.98:6005

Я тестировал потоковое с ffplay. Я использую следующую команду:

ffplay -protocol_whitelist "file,rtp,udp" -i saved_sdp_test.sdp -reorder_queue_size 0

Кажется, все работает, и я могу отправлять и получать несколько видео. Но я не знаю, как я мог передать опцию -reorder_queue_size в OpenCV.

Я знаю, что это было бы возможно и с gstreamer вместо ffmpeg. Но есть проблема утечки памяти с gstreamer-api в OpenCV (https://github.com/opencv/opencv/issues/5715), которую я не смог устранить.

Вопрос

Как я могу использовать OpenCV с ffmpeg для получения нескольких видео (последовательно) через rtp?

1 Ответ

0 голосов
/ 11 февраля 2020

Я могу добавить опцию -reorder_queue_size так же, как я добавила опцию protocol_whitelist. Я просто должен использовать | между опциями. Чем все работает как положено.

char env[] = "OPENCV_FFMPEG_CAPTURE_OPTIONS=protocol_whitelist;file,rtp,udp | reorder_queue_size;0";
putenv(env);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...