Russian Qt Forum
Июнь 04, 2024, 08:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отображение потока MJPEG от нескольких IP-камер  (Прочитано 4384 раз)
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« : Апрель 08, 2014, 19:42 »

Добрый вечер.
Есть 5 IP-камер. Делаю вывод изображений от всех камер в 1 окне.
Для отдельно взятой камеры создал класс(потомок QWidget), который содержит QLabel, создаю отдельный поток, в который передаю указатель на этот виджет.
В потоке использую QTcpSocket, отправляю запрос камере, получаю поток данных MJPEG. К сигналу readyRead подсоединил слот:
Код:
QByteArray readed = socket->readAll();
buffer.append(readed);
updateImage();
if (buffer.size() > MAX_BUFFER_SIZE) {
    buffer.remove(0, MAX_BUFFER_SIZE);
}
Функция updateImage() выглядит так:
Код:
int pos1 = buffer.indexOf("\r\n\r\n");
if (pos1 != -1) {
    int pos2 = buffer.indexOf("\r\n\r\n", pos1 + 4);
    if (pos2 != -1) {
        QByteArray ba = buffer.mid(pos1 + 4, pos2 - pos1 - 4);
        QImage image_ = QImage::fromData(ba, "JPEG");
        if (!image_.isNull()) {
            QMetaObject::invokeMethod(surface, "setNewImage", Qt::QueuedConnection, Q_ARG(QImage, image_));
        }
        buffer.remove(0, pos2);
    }
}
Где surface - это указатель на виджет, его слот setNewImage() рисует на QLabel кадр:
Код:
label->setPixmap(QPixmap::fromImage(image)); 
И все бы ничего, с одной камерой работает хорошо, но когда 5 таких виджетов скомпоновать вместе, запускается уже 5 таких потоков и загрузка процессора достигает 70-90% на Windows 7 x64 (Qt 4.7.4), на Ubuntu 13.04 (32-разрядная, Qt 4.8 ) системный монитор показывает загрузку около 30%.

Вопросы такие:
Можно ли как-то уменьшить загрузку процессора, особенно под Windows?
Почему такая загрузка ЦП?
Возможно, следует использовать другой подход, алгоритм и т.п.?
Рад буду выслушать любые ваши предложения, критику и уточняющие вопросы.
Записан
OKTA
Гость
« Ответ #1 : Апрель 08, 2014, 20:00 »

Бывает процессор загружен из-за того, что сетевая карта под дикой нагрузкой работает. А картиночки большие?
Записан
torwig
Самовар
**
Offline Offline

Сообщений: 134



Просмотр профиля
« Ответ #2 : Апрель 08, 2014, 21:05 »

Не думаю, что сетевая карта загружена так сильно. Картинки 640х480, FPS 30.
Если закомментировать
Код:
QMetaObject::invokeMethod(surface, "setNewImage", Qt::QueuedConnection, Q_ARG(QImage, image_));
загрузка ЦП упадет до 20%.
Записан
qtdevel
Гость
« Ответ #3 : Июль 04, 2014, 00:01 »

Нужно использовать OpenGL для отрисовки, при этом данные переводить в пространство YUV, формировать текстуры и создавать шейдер. Задача, мягко говоря, нетривиальная.
У меня так 5 камер показывает, при этом загрузка 9-11% на мощном компе. А до этого делал тоже через QImage, и загрузка одной камеры на компе, где я разрабатывал, была 80%, а с OpenGL все камеры около 43%.
« Последнее редактирование: Июль 04, 2014, 00:23 от qtdevel » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.041 секунд. Запросов: 20.