Каков наилучший способ обработки видео и передачи на плате imx6? - PullRequest
0 голосов
/ 16 ноября 2018

В последнее время я пытаюсь использовать плату с процессором imx6 и камерой MIPI-CSI для передачи видео.

Наша цель - передать видео (1920x1080 при 30 кадр / с) по протоколу RTP, и мысделал это, используя gstreamer трубопроводов.Командный конвейер для передачи:

gst-launch-1.0 imxv4l2videosrc device=/dev/video1 imx-capture-mode=2 ! imxvpuenc_h264 quant-param=29 ! rtph264pay mtu=60000 ! udpsink host=10.42.0.1 port=5000 sync=false

Команда передает видео с разрешением 1920x108 (параметр imx-capture-mode = 2).

И с ПК (10.42.0.1) мы ловим видео (через порт 5000), используя команду:

gst-launch-1.0 -v udpsrc port=5000 ! application/x-rtp, media=video, clock-rate=90000, encoding-name=H264, payload=96 !  rtph264depay ! avdec_h264 ! fpsdisplaysink text-overlay=false sync=false &

И поток видео очень хороший.

Но теперь мы хотим обработать видео до того, как онопередается, потому что камера находится в движении, и нам нужно добавить некоторые алгоритмы, чтобы уменьшить шум из-за тряски.

Другими словами, основная идея такова: взять видео с камеры-> обработать видео-> передать в RTP.Все это с помощью платы с imx6.

Плата основана на проекте linux yocto и имеет opencv 3.1 с включенным плагином gstreamer.Наша идея состоит в том, чтобы снимать видео с использованием конвейеров opencv и gstreamer, обрабатывать и передавать его ... Но сначала мы провели некоторый тест, беря видео и передавая его без обработки, но когда мы ловим видео с ПК, оно очень медленноеи задерживается ...

Мы хотим знать, является ли это правильным путем для нашей цели.Вот исходный код, который мы используем:

#include <QCoreApplication>
#include <QDebug>
#include <opencv2/opencv.hpp>
#include <opencv2/video.hpp>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    cv::VideoCapture cap("imxv4l2videosrc device=/dev/video1 imx-capture-mode=2 ! videoconvert ! appsink");
    Q_ASSERT(cap.isOpened());
    if(!cap.isOpened())
    {
        qDebug() << "Error with the video capturer";
        a.exit(-1);
    }
    cv::Mat frame;
    cap >> frame; //Dummy read
    double frame_width=   cap.get(CV_CAP_PROP_FRAME_WIDTH);
    double frame_height=   cap.get(CV_CAP_PROP_FRAME_HEIGHT);

    cv::VideoWriter writer;
    writer.open("appsrc ! videoconvert ! imxvpuenc_h264 quant-param=29 ! rtph264pay mtu=60000 ! udpsink host=10.42.0.1 port=5000 sync=false",
                0,30,cv::Size(frame_width,frame_height));
    if(!writer.isOpened())
    {
        qDebug() << "Error video writer";
        a.exit(-1);
    }

    while(true) {

            cap.read(frame);

            if(frame.empty())
                break;

            writer.write(frame);
            cv::waitKey(33);
        }

    return a.exec();
}

1 Ответ

0 голосов
/ 22 ноября 2018

Я предполагаю, что причиной замедления вашего видео является конвертация видео формата. OpenCv получает видео в формате BGR от элемента gstreamer appsink. Если ваш imxv4l2videosrc выводит другой формат (например, UYVY или I420), элементу videoconvert придется много вычислять. В некоторых случаях эти вычисления используют более 100% вашего процессора, и это замедлит ваш поток ввода.

Вы можете проверить, какой формат использует исходный канал, добавив -v в конец канала.

gst-launch-1.0 imxv4l2videosrc device=/dev/video1 imx-capture-mode=2 ! imxvpuenc_h264 quant-param=29 ! rtph264pay mtu=60000 ! udpsink host=10.42.0.1 port=5000 sync=false -v

Мы можем проверить, замедляет ли преобразование видео вашу систему, уменьшая разрешение. Можете ли вы попробовать еще раз, уменьшив разрешение до 1280x720 или 640x360, и проверить загрузку вашего процессора?

Если это так, мы можем запросить вывод у imxv4l2videosrc в разных форматах. Я не использовал этот элемент, и я не знаю его возможностей. Но вы можете проверить возможности с помощью команды gst-inspect-1.0.

gst-inspect-1.0 imxv4l2videosrc

На выходе будет такая часть

Pad Templates:
  SRC template: 'src'
    Availability: Always
    Capabilities:

      video/x-raw
                 format: { (string)RGB16, (string)BGR, (string)RGB, (string)GRAY8, (string)GRAY16_LE, (string)GRAY16_BE, (string)YVU9, (string)YV12, (string)YUY2, (string)YVYU, (string)UYVY, (string)Y42B, (string)Y41B, (string)YUV9, (string)NV12_64Z32, (string)NV24, (string)NV61, (string)NV16, (string)NV21, (string)NV12, (string)I420, (string)BGRA, (string)BGRx, (string)ARGB, (string)xRGB, (string)BGR15, (string)RGB15 }
                  width: [ 1, 32768 ]
                 height: [ 1, 32768 ]
              framerate: [ 0/1, 2147483647/1 ]

Форматы, такие как BGRx, 'RGB' или 'xRGB', имеющие каналы B, G и R., будут полезными и быстрыми для вас.

...