Потоковая передача видео из ffmpeg и захват с помощью OpenCV

У меня есть видеопоток, поступающий по rtp на ffmpeg, и я хочу передать его своим инструментам OpenCV для обработки потоковой передачи в реальном времени. Связь rtp работает, потому что я могу отправить входящие данные в файл и воспроизвести его (или воспроизвести, если через ffplay). Моя реализация OpenCV также работает, потому что я могу захватывать видео из файла, а также с веб-камеры.

Проблема заключается в потоковой передаче в OpenCV. Я слышал, что это можно сделать с помощью именованного канала. Сначала я мог передать вывод ffmpeg в канал, а затем заставить OpenCV открыть этот канал и начать обработку.

Что я пробовал:

Я создаю именованный канал в моем cygwin bash:

    $ mkfifo stream_pipe

Затем я использую мою команду ffmpeg, чтобы вытащить поток из rtp и отправить его в канал:

    $ ffmpeg -f avi -i rtp://xxx.xxx.xxx.xxx:1234 -f avi -y out.avi > stream_pipe

I Я не уверен, что это правильный способ отправки потока в именованный канал, но, похоже, он принимает команду и работает, потому что вывод ffmpeg дает мне битрейты, fps и т. д.

Затем я использую именованный канал в своей функции захвата OpenCV:

    $ ./cvcap.exe stream_pipe

где код для cvcap.cpp сводится к следующему:

    cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]);

Программа, кажется, зависает при достижении этой одной строки, поэтому мне интересно, это правильный способ сделать это. Я никогда раньше не использовал именованные каналы, и я не уверен, что это правильное использование.Кроме того, я не знаю, нужно ли мне обрабатывать именованный канал по-другому в OpenCV - измените код, чтобы принять этот тип ввода. Как я уже сказал, мой код уже принимает файлы и входные данные камеры, я просто завис на входящем потоке. Я только слышал, что именованные каналы могут использоваться для OpenCV - я не видел никакого реального кода или команд!

Любая помощь или идеи приветствуются!

ОБНОВЛЕНИЕ:

Я считаю, что именованные каналы могут работать не так, как я предполагал. Как видно из этого сообщения на форуме cygwin:

Проблема в том, что реализация FIFOS в Cygwin содержит очень много ошибок. Я бы не рекомендовал использовать FIFO ни для чего, кроме самых простых приложений.

Возможно, мне нужно найти другой способ сделать это. Я попытался передать вывод ffmpeg в обычный файл, а затем OpenCV прочитал его одновременно. В некоторой степени это работает, но я полагаю, что одновременное чтение и запись из файла может быть опасно - кто знает, что произойдет!

9
задан chembrad 7 October 2011 в 14:48
поделиться