Открытие конвейера GStreamer из OpenCV с помощью VideoWriter

Я собираю и обрабатываю видеокадры с помощью OpenCV, и я хотел бы записать их в виде видеофайла h265. Я изо всех сил пытаюсь получить правильный конвейер Gstreamer для работы с OpenCV.

Gstreamer прекрасно работает сам по себе. В частности, я могу запустить эту команду, которая очень быстро кодирует видео (благодаря ускорению графического процессора) и сохраняет его в файл mkv:

gst-launch-1.0 videotestsrc num-buffers=90 ! 'video/x-raw, format=(string)I420, width=(int)640, height=(int)480' ! omxh265enc ! matroskamux ! filesink location=test.mkv

Теперь я хотел бы сделать то же самое из моего приложения OpenCV. Мой код что-то вроде:

Mat img_vid = Mat(1024, 1024, CV_8UC3);

VideoWriter video;
video.open("appsrc ! autovideoconvert ! omxh265enc ! matroskamux ! filesink location=test.mkv", 0, (double)25, cv::Size(1024, 1024), true);

if (!video.isOpened()) {
   printf("can't create writer\n");
   return -1;
}

while ( ... ) {

   // Capture frame into img_vid => That works fine

   video.write(img_vid);

   ...
}

На первый взгляд кажется, что это работает, но он создает файл с именем "appsrc ! autovideoconvert ! omxh265enc ! matroskamux ! filesink location=test.mkv" и заполняет его несжатыми видеокадрами, полностью игнорируя тот факт, что это конвейер Gstreamer.

Я пробовал другие конвейеры, но они приводят к множеству ошибок:

video.open("appsrc ! autovideoconvert ! omxh264enc ! 'video/x-h264, streamformat=(string)byte-stream' ! h264parse ! qtmux ! filesink location=test.mp4 -e", 0, (double)25, cv::Size(1024, 1024), true);

Что приводит к:

(Тест:5533): GStreamer-CRITICAL **: gst_element_make_from_uri: утверждение 'gst_uri_is_valid (uri)' не выполнено Ошибка OpenCV: неуказанная ошибка (GStreamer: не удается найти appsrc в ручном конвейере) в CvVideoWriter_GStreamer:: ubu /openuvu, файл, файл /modules/videoio/src/cap_gstreamer.cpp, строка 1363 VIDEOIO(cvCreateVideoWriter_GStreamer(имя файла, fourcc, fps, frameSize, is_color)): повышенное исключение OpenCV:

/home/ubuntu/opencv/modules/videoio/src/cap_gstreamer.cpp:1363: ошибка: (-2) GStreamer: не удается найти appsrc в ручном конвейере в функции CvVideoWriter_GStreamer::open

Я также попробовал простое:

video.open("appsrc ! autovideosink", 0, (double)25, cv::Size(1024, 1024), true);

который дает:

Плагин GStreamer: воспроизведение встроенного видео остановлено; Модуль appsrc0 сообщил: Внутренняя ошибка потока данных.

Я использую OpenCV 3.1 с поддержкой Gstreamer. Аппаратное обеспечение - Jetson TX1 с L4T 24.2.1.

1 ответ

Решение

Я сталкивался с подобной проблемой раньше. Поскольку имя канала / файла заканчивается на .mkvOpenCV интерпретирует его как видеофайл вместо конвейера.

Вы можете попробовать закончить его с пустым интервалом, как после mkv

video.open("appsrc ! autovideoconvert ! omxh265enc ! matroskamux ! filesink location=test.mkv ", 0, (double)25, cv::Size(1024, 1024), true);

или с фиктивным свойством, таким как

video.open("appsrc ! autovideoconvert ! omxh265enc ! matroskamux ! filesink location=test.mkv sync=false", 0, (double)25, cv::Size(1024, 1024), true);
Другие вопросы по тегам