У меня есть видеопоток, поступающий по 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
Я не уверен, что это правильный путьоб отправке потока в именованный канал, но кажется, что он принимает команду и работает из-за того, что вывод ffmpeg дает мне битрейт, fps и т. д.
Далее я использую именованный канал в моей функции захвата OpenCV:
$ ./cvcap.exe stream_pipe
, где код для cvcap.cpp сводится к следующему:
cv::VideoCapture *pIns = new cv::VideoCapture(argv[1]);
Программа, кажется, зависает при достижении этой одной строки, поэтому мне интересно, если этоправильный способ идти об этом.Я никогда раньше не использовал именованные каналы, и я не уверен, что это правильное использование.Кроме того, я не знаю, нужно ли мне по-другому обрабатывать именованный канал в OpenCV - измените код, чтобы принять этот тип ввода.Как я уже сказал, мой код уже принимает файлы и входные данные камеры, я просто завис на входящем потоке. Я только слышал, что именованные каналы могут использоваться для OpenCV - я не видел ни одного реального кода или команд!
Любая помощь или понимание приветствуются!
ОБНОВЛЕНИЕ:
Я считаю, что именованные каналы могут работать не так, как я планировал.Как видно из этого сообщения на форуме cygwin:
Проблема в том, что реализация Cygwin в fifos очень глючная.Я бы не рекомендовал использовать fifos для чего-либо, кроме самых простых приложений.
Возможно, мне придется найти другой способ сделать это.Я попытался перенаправить вывод ffmpeg в обычный файл, а затем одновременно прочитать его OpenCV.Это работает в некоторой степени, но я думаю, что может быть опасно одновременно читать и писать из файла - кто знает, что произойдет!