Я создаю (очень простой) сервер MJPG
для отображения данных веб-камеры в браузере. Частично мне удалось это сделать.Ошибка при использовании QTcpSocket
Вот мой код:
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();
, хотя приложение бросил ошибку с этим код. Любая помощь в том, как это исправить?
EDIT -
Я попробовал метод лямбда и он работал отлично. Однако я до сих пор сталкиваются 2 проблемы -
Размер изображения должен быть чрезмерно низкой (около 270x480 с самым низким качеством JPG)
(ВАЖНЕЕ) я должен вручную нажмите перезагрузите кнопку в браузере, чтобы перезагрузить изображение, оно не меняется автоматически с одного изображения на другое.
Не использовал QT в то время как факт, поскольку [Project вы основали свой код на] (http: // stackoverflow.com/questions/33064955/how-to-create-a-http-mjpeg-streaming-server-with-qtcp-server-sockets/33096855? noredirect = 1 # comment61611267_33096855), но я рекомендую вам использовать задержку между отправкой фреймов (например, 'QThread :: usleep (500);'). Основной причиной является то, что этот метод (говоря о сервере «MJPEG» в настоящее время не очень эффективен, когда речь идет о производительности. В моих тестах, когда я устанавливал задержку между отправкой кадров на низкое значение, видео всегда застряло на некоторых point –