Чтение потока h264 с IP-камеры

В настоящее время я пытаюсь использовать opencv для чтения видео с моей камеры Canon VB-H710F.

Для этого я попробовал два разных решения:

РЕШЕНИЕ 1: Прочитать поток с адреса rtsp

 VideoCapture cam ("rtsp://root:[email protected]/stream/profile1=u");

 while(true)
  cam >> frame;

В этом случае я использую opencv для прямого чтения из потока, закодированного с помощью H264 (profile1), однако это приводит к той же проблеме, о которой сообщается здесь http://answers.opencv.org/question/34012/ip-camera-h264-error-while-decoding/ Как предложено в В предыдущем вопросе я попытался отключить поддержку FFMPEG в установке opencv, что устранило ошибки декодирования h264, но подняло другую проблему. При доступе к потоку с помощью opencv, поддерживаемого gstreame, всегда связана большая задержка. С этим решением я получаю 15 кадров в секунду, но у меня задержка в 5 секунд, что неприемлемо, учитывая, что мне нужно приложение реального времени.

РЕШЕНИЕ 2: Прочтите кадры с http-адреса while (true) {startTime = System.currentTimeMillis ();

        URL url = new URL("h t t p://[IP]/-wvhttp-01-/image.cgi");
        URLConnection con = url.openConnection();
        BufferedImage image = ImageIO.read(con.getInputStream());   
        showImage(image);
        estimatedTime=System.currentTimeMillis()-startTime;
        System.out.println(estimatedTime);
        Thread.sleep(5);
}

Эта стратегия просто захватывает кадр из URL-адреса, предоставленного камерой. Код находится на Java, но результаты такие же на C ++ с библиотекой curl. Это решение позволяет избежать задержки первого решения, однако для захвата каждого кадра требуется немногим более 100 мс, что означает, что я могу достичь в среднем только 10 кадров в секунду.

Я хотел бы знать, как я могу прочитать видео, используя c ++ или другую библиотеку, разработанную на c ++?


person João Neves    schedule 04.10.2014    source источник


Ответы (3)


Я боролся с подобными проблемами и думаю, что решил некоторые из ваших проблем, используя libVLC с OpenCV. FFMPEG, похоже, имел проблемы с неправильным декодированием H264, плюс в более новых версиях (2.4.11), похоже, уже было исправление TCP для FFMPEG. В любом случае, я использую MS Visual Studio в Windows 7 и 8.1.

Подробности приведены здесь: http://answers.opencv.org/question/65932.

person JoeC    schedule 13.07.2015

Лично я предлагаю вам использовать ffmpeg для чтения потоков rtsp с IP-камер, а затем использовать openCV для чтения из декодированного буфера из ffmpeg. ffmpeg имеет очень хорошую оптимизацию для декодирования H.264, производительность не должна быть критической проблемой.

Вы можете использовать двоичный файл ffmpeg, чтобы проверить, правильно ли это работает:

ffmpeg -i "rtsp://root:[email protected]/stream/profile1=u" -vcodec copy -acodec none test.mp4

Если test.mp4 можно успешно воспроизвести, то для вас определенно нормально интегрировать библиотеки ffmpeg в свой проект.

Удачи!

person JasonYang    schedule 05.10.2014
comment
Благодарю за ответ. Несмотря на то, что я могу успешно записывать видео со скоростью 15 кадров в секунду, это решение не соответствует моим целям, поскольку в вашем примере ffmpeg просто копирует видео в файл без декодирования, а в моем случае мне нужно декодировать в режиме реального времени. - person João Neves; 17.10.2014
comment
Да, я понимаю, что вам нужно извлекать кадры и обрабатывать каждый кадр. Пример ffmpeg - это проверка того, подходит ли входной сигнал для обработки, а также может ли быть правильно обработан с помощью ffmpeg. Как вы проверили, теперь вы можете начать компилировать библиотеки ffmpeg и использовать ffmpeg lib для декодирования кадров вручную с помощью кодов, и данные кадров будут доступны вам в конвейере декодирования. Различные руководства по разработке ffmpeg доступны в Интернете. - person JasonYang; 18.10.2014
comment
Я уже пробовал это, но проблема остается, поскольку в прошлом я мог получить доступ только к кадрам продолжительностью 2 секунды (я думаю, что это связано с размером буфера ffmpeg). Знаете ли вы, как уменьшить размер этого буфера при сохранении декодирования в реальном времени? Я уже искал в Интернете, но не смог найти никакого решения. Еще раз спасибо - person João Neves; 18.10.2014

Вы также можете обрабатывать каждый кадр с помощью ffmpeg. вам необходимо создать свой собственный фильтр в соответствии с вашими требованиями. https://trac.ffmpeg.org/wiki/FilteringGuide

person Ajay nandoriya    schedule 26.05.2015