Потоковое видео из ffmpeg и захват с OpenCV - PullRequest
8 голосов
/ 27 сентября 2011

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

1 Ответ

9 голосов
/ 07 ноября 2011

надеюсь, еще не поздно ответить, но я попробовал то же самое некоторое время назад, и вот как я это сделал.

Сервером декодирования видео для OpenCV на самом деле является ffmpeg, поэтому все его возможности доступны и в OpenCV.Не весь интерфейс доступен, и это добавляет некоторые трудности, но вы можете отправить адрес потока rtp в OpenCV.

cap.open("rtp://xxx.xxx.xxx.xxx:1234");

Важно : OpenCV не может получить доступ к защищенному паролемrtp потоки.Для этого вам нужно будет указать имя пользователя и пароль, API для этого не предоставляется.

...