нужно сжать QImage чтобы отправить его по IP - PullRequest
2 голосов
/ 10 мая 2011

Я программирую приложение (в C ++ / Qt Designer 4.6 и использую некоторые библиотеки, такие как ffmpeg и v4l2), которые захватывают с веб-камеры, и я хочу отправить захваченное QImage по IP, поэтому я отправляю егов QTcpSocket, и мне удалось получить его в моем серверном приложении, но проблема в том, что он слишком медленный, из-за того, что QImage не сжат, поэтому я не получаю желаемый результат - потоковое видео в реальном времени через IP, мойВопрос в том, как я могу сжать QImage?Я думаю, что при преобразовании его в формат YUV, но я не могу понять, это несколько строк из моего кода для отправки доступных QImage:

QImage image;
QByteArray ba;
QBuffer buffer(&ba);
image.save(&buffer, "PNG");
imsocket->write(ba);

Ответы [ 4 ]

2 голосов
/ 16 мая 2011

Лучше отправлять сжатый видеопоток MPEG вместо сжатия каждого кадра в виде QImage и отправлять его по сети.

Сжатые видеопотоки MPEG используют технику, которая использует полноразмерное изображение для первого кадра изатем записываются только измененные пиксели для каждого следующего кадра, что обеспечивает максимальное сжатие, а также плавное воспроизведение видео по сети.

На стороне клиента вы будете воспроизводить, получая кадры, сгенерированные библиотекой, из сжатого потока MPEG.

0 голосов
/ 22 марта 2014

У меня была проблема, подобная описанной выше, мой код выглядел так:

QBuffer buffer;
buffer.open(QIOdevice::WriteOnly);
QDataStream stream(&buffer);
stream << image;

Используя QElapsedTimer, я обнаружил, что кодирование изображения занимает более 500 мс для изображения размером 1024x768.Используя valgrind, я обнаружил, что время было потрачено на png_write_image , который вызывался из QImageWriter :: write (QImage)

Вместо этого изменив код для кодирования в формате JPG,заставил код исполниться всего за 5мс для того же изображения.Получившийся код выглядел так:

QBuffer buffer;
buffer.open(QIODevice::WriteOnly);
image.save(&buffer,"JPEG");

К сожалению, я не нашел способа сказать QDataStream кодировать изображения в формате JPG, а не в формате PNG, поэтому очевидно, что сторона декодирования должна быть адаптирована для декодирования изображения следующим образом:

image.load(&buffer, "JPEG");
0 голосов
/ 16 мая 2011

Вы должны придерживаться первого правила оптимизации: не оптимизируйте, если вы не измерили, где ваше приложение тратит свое время. Я полагаю, вы просто угадываете, какая часть вашего приложения работает медленно.

0 голосов
/ 10 мая 2011

Перед отправкой образа вы можете сжать массив байтов, а затем распаковать его на сервере.Это должно послужить хорошим стимулом для вас.

QByteArray arr, cArr;
cArr = qCompress(arr);
...