Я создаю (очень простой) сервер MJPG
для отображения данных веб-камеры в браузере. Мне пока частично это удается.
Вот мой код:
TcpServer::TcpServer(QObject *parent) :
QObject(parent)
{
server = new QTcpServer(this);
// whenever a user connects, it will emit signal
connect(server, SIGNAL(newConnection()),
this, SLOT(newConnection()));
if (!server->listen(QHostAddress::Any, 9999))
qDebug() << "Server could not start";
else
qDebug() << "Server started!";
}
...
void TcpServer::newConnection()
{
QTcpSocket *socket = server->nextPendingConnection();
QByteArray ContentType = ("HTTP/1.0 200 OK\r\n" \
"Cache-Control: no-cache\r\n" \
"Cache-Control: private\r\n" \
"Content-Type: multipart/x-mixed-replace;boundary=--boundary\r\n");
socket->write(ContentType);
std::vector<uchar> buff;
Mat img; //OpenCV Material
while (1) {
// Image to Byte Array via OPENCV Method
buff.clear();buff.empty();
vCapture->read(img); //Read from webcam
imencode(".jpg", img, buff, compression_params);
std::string content(buff.begin(), buff.end());
QByteArray CurrentImg(QByteArray::fromStdString(content));
QByteArray BoundaryString = ("--boundary\r\n" \
"Content-Type: image/jpeg\r\n" \
"Content-Length: ");
BoundaryString.append(QString::number(CurrentImg.length()));
BoundaryString.append("\r\n\r\n");
socket->write(BoundaryString);
socket->write(CurrentImg); // Write The Encoded Image
socket->flush();
}
}
Проблема —
Когда я запускаю эту программу, отображается первое изображение. После этого в приложении постоянно печатается следующая ошибка:
QIODevice::write (QTcpSocket): device not open
Было похоже, что сокет закрылся, поэтому я использовал повторную инициализацию сокета, вот так - socket = server->nextPendingConnection();
, хотя приложение выдало ошибку с этим кодом. Любая помощь, как это исправить?
ИЗМЕНИТЬ –
Я попробовал метод лямбда, и он работал нормально. Однако я все еще сталкиваюсь с двумя проблемами:
Размер изображения должен быть слишком маленьким (около 270x480 с самым низким качеством JPG).
(БОЛЬШЕ ВАЖНО) Мне приходится вручную нажимать кнопку перезагрузки в браузере, чтобы перезагрузить изображение, оно не меняется автоматически с одного изображения на другое.
QThread::usleep(500);
). Основная причина заключается в том, что этот метод (если говорить о сервере MJPEG в настоящее время не очень эффективен, когда речь идет о производительности. В моих тестах, когда я устанавливал задержку между отправкой кадров на низкое значение, видео всегда зависало в какой-то момент. - person hypnomaki   schedule 04.05.2016