Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: torwig от Апрель 08, 2014, 19:42



Название: Отображение потока MJPEG от нескольких IP-камер
Отправлено: torwig от Апрель 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?
Почему такая загрузка ЦП?
Возможно, следует использовать другой подход, алгоритм и т.п.?
Рад буду выслушать любые ваши предложения, критику и уточняющие вопросы.


Название: Re: Отображение потока MJPEG от нескольких IP-камер
Отправлено: OKTA от Апрель 08, 2014, 20:00
Бывает процессор загружен из-за того, что сетевая карта под дикой нагрузкой работает. А картиночки большие?


Название: Re: Отображение потока MJPEG от нескольких IP-камер
Отправлено: torwig от Апрель 08, 2014, 21:05
Не думаю, что сетевая карта загружена так сильно. Картинки 640х480, FPS 30.
Если закомментировать
Код:
QMetaObject::invokeMethod(surface, "setNewImage", Qt::QueuedConnection, Q_ARG(QImage, image_));
загрузка ЦП упадет до 20%.


Название: Re: Отображение потока MJPEG от нескольких IP-камер
Отправлено: qtdevel от Июль 04, 2014, 00:01
Нужно использовать OpenGL для отрисовки, при этом данные переводить в пространство YUV, формировать текстуры и создавать шейдер. Задача, мягко говоря, нетривиальная.
У меня так 5 камер показывает, при этом загрузка 9-11% на мощном компе. А до этого делал тоже через QImage, и загрузка одной камеры на компе, где я разрабатывал, была 80%, а с OpenGL все камеры около 43%.