У меня есть видеопоток, поступающий по 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 прочитал его одновременно. В некоторой степени это работает, но я полагаю, что одновременное чтение и запись из файла может быть опасно - кто знает, что произойдет!