Я создаю QTcpServer для отправки потока MJPEG клиентам, которые подключаются к серверу. Когда я получаю сигнал newConnection от сервера, я добавляю QTcpSocket в QList. Затем другая функция получает кадры и проверяет, не является ли QList непустым. Проблема в том, что даже после получения соединения QList с точки зрения другой функции остается пустым.
Я установил QTcpServer следующим образом:
server = new QTcpServer(this);
connect(server, SIGNAL(newConnection()), this, SLOT(newConnection()));
Затем при каждом новом подключении:
void
MjpegServer::newConnection() {
if(!socketMutex.tryLock(1000)) {
qCritical() << "Could not lock sendFrame Mutex to add new client";
return;
}
while(server->hasPendingConnections()) {
qInfo() << "Got new MJPEG Connection";
m_clients.append(server->nextPendingConnection());
QByteArray ContentType = ("HTTP/1.0 200 OK\r\n" \
"Cache-Control: no-cache\r\n" \
"Pragma: no-cache\r\n" \
"Connection: close\r\n" \
"Content-Type: multipart/x-mixed-replace; boundary=mjpegstream\r\n\r\n");
m_clients.last()->write(ContentType);
m_clients.last()->flush();
m_clients.last()->waitForBytesWritten(3000);
connect(m_clients.last(), &QTcpSocket::disconnected, this, &MjpegServer::socketDisconnected);
connect(m_clients.last(), SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
qInfo() << "Clients now connected: " + QString::number(m_clients.count());
}
socketMutex.unlock();
}
Когда я запускаю код и клиент подключается, я получаю распечатку, в которой говорится, что m_clients.count () равен 1. У меня есть функция, которая отправляет видеокадры:
void
MjpegServer::sendFrame(Mat &img) {
if(!socketMutex.tryLock(1000)) {
qCritical() << "Could not lock sendFrame Mutex";
return;
}
// Only encode if there are connected clients
if(m_clients.count() == 0) {
socketMutex.unlock();
qInfo() << "No clients";
return;
}
qInfo() << "Encoding image";
std::vector<uchar> outbuf;
std::vector<int> params;
params.push_back(CV_IMWRITE_JPEG_QUALITY);
params.push_back(100);
imencode(".jpg", img, outbuf, params);
std::string content(outbuf.begin(), outbuf.end());
QByteArray CurrentImg(QByteArray::fromStdString(content));
QByteArray BoundaryString = ("--mjpegstream\r\nContent-Type: image/jpeg\r\nContent-Length: ");
BoundaryString.append(QString::number(CurrentImg.length()));
BoundaryString.append("\r\n\r\n");
for( int i=0; i < m_clients.count(); ++i ) {
qInfo() << "Writing data to client " + QString::number(i);
QTcpSocket* socket = m_clients.at(i);
socket->write(BoundaryString);
socket->write(CurrentImg); // Write The Encoded Image
socket->flush();
}
socketMutex.unlock();
}
Прямо сейчас это только печатает "Нет клиентов". Даже после того, как клиент подключился. У меня также есть сигналы, подключенные к монитору, когда QTcpSockets отключены или их состояние меняется, эти сигналы не срабатывают. Соединения QTcpSockets, кажется, не отключаются, но функция sendFrame не может видеть их в QList.
Буду признателен за любую помощь ...