【发布时间】:2016-08-29 18:04:21
【问题描述】:
我正在创建一个(非常基本的)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();
}
}
问题 -
当我运行这个程序时,会显示第一张图片。之后在app上不断打印如下错误-
QIODevice::write (QTcpSocket): device not open
看起来套接字已关闭,所以我使用重新初始化套接字,如下所示 - socket = server->nextPendingConnection();,尽管应用程序使用此代码引发了错误。有关如何解决此问题的任何帮助?
编辑 -
我尝试了 lambda 方法,效果很好。但是,我仍然面临 2 个问题 -
图像尺寸必须过小(大约 270x480,JPG 质量最低)
-
(更重要的)我必须手动按下浏览器上的重新加载按钮才能重新加载图像,它不会自动从一个图像更改为另一个。
【问题讨论】:
-
自从the Project you based your Code on 以来,已经有一段时间没有使用 QT,但我建议您在发送帧之间使用延迟(例如
QThread::usleep(500);)。主要原因是这种方法(当时说到“MJPEG”服务器在谈到性能时并不是很有效。在我的测试中,当我将发送帧之间的延迟设置为低值时,视频总是卡在某个点。
标签: c++ qt mjpeg qtcpsocket qtnetwork