Wie erstelle ich einen HTTP-MJPEG-Streaming-Server mit QTcp-Server-Sockets?

Ich möchte einen HTTP-Server zum Senden eines MJPEG-Streams erstellen. Ich kann bereits ein Bild, aber keinen Live-Stream senden.

Was ich getan habe: Erstellt einen TCP-Server. Wenn ein Client eine Verbindung herstellt, wird ein TCP-Socket erstellt. Dann habe ich einen ReadyRead SLOT implementiert, der ausgeführt wird, wenn der Browser die "GET" -Anforderung an den Server sendet.

GET / HTTP/1.1
Host: 127.0.0.1:8889
User-Agent: Mozilla/5.0...

Dann führe ich folgenden Code aus

QString inbound = m_Client->readAll();

QByteArray header = "HTTP/1.1 200 OK\r\n";
m_Client->write(header);

QByteArray ContentType = "Content-Type: image/jpeg\r\n\n";
m_Client->write(ContentType);

Mat first_img; //OPENCV Material
m_Stream->read(first_,img); // Read Image from Webcam
QImage img = Mat2QImage(first_img); // Convert to QImage
QByteArray ba; // QByteArray as Buffer for JPG Envoded QImage
QBuffer buffer(&ba);
buffer.open(QIODevice::WriteOnly);
img.save(&buffer, "JPG");
m_Client->write(ba); // Write The Encoded Image

m_Client->close();

Ich habe darüber nachgedacht, eine Schleife zu erstellen, um den Bild-Streaming-Teil zu wiederholen, aber das funktioniert nicht. Der Browser lädt einfach weiter und es passiert nichts ....

while(1){
    Mat first_img; //OPENCV Material
    m_Stream->read(first_img); // Read Image from Webcam

    QImage img = Mat2QImage(first_img); // Convert to QImage
    QByteArray ba; // QByteArray as Buffer for JPG Envoded QImage
    QBuffer buffer(&ba);
    buffer.open(QIODevice::WriteOnly);
    img.save(&buffer, "JPG");

    m_Client->write(ba); // Write The Encoded Image

    QThread::usleep(500);
}

Was vermisse ich? Ist die Codierung falsch oder wie gehe ich mit der Anfrage um? Vielleicht MIME-Typen?

Aktualisiere Ich hatte einen Blick auf
http: //www.damonkohler.com/2010/10/mjpeg-streaming-protocol.htm undhttps: //en.wikipedia.org/wiki/Motion_JPE und habe versucht, diese Methoden zu implementieren, aber ohne Ergebnisse ....

QString inbound = m_Client->readAll();

QByteArray ContentType = ("HTTP/1.0 200 OK\r\n" \
        "Server: YourServerName\r\n" \
        "Connection: close\r\n" \
        "Max-Age: 0\r\n" \
        "Expires: 0\r\n" \
        "Cache-Control: no-cache, private\r\n" \
        "Pragma: no-cache\r\n" \
        "Content-Type: multipart/x-mixed-replace; " \
        "boundary=--BoundaryString\r\n\r\n");
m_Client->write(ContentType);



while(1){
    Mat first_img; //OPENCV Material
    m_Stream->read(first_img); // Read Image from Webcam

    QImage img = Mat2QImage(first_img); // Convert to QImage
    QByteArray ba; // QByteArray as Buffer for JPG Envoded QImage
    QBuffer buffer(&ba);
    buffer.open(QIODevice::WriteOnly);
    img.save(&buffer, "JPG");

    QByteArray BoundaryString = ("--BoundaryString\r\n" \
                                 "Content-type: image/jpg\r\n\r\n");

    m_Client->write(BoundaryString);
    m_Client->write(ba); // Write The Encoded Image

    QThread::usleep(500);
}

m_Client->close();

Antworten auf die Frage(2)

Ihre Antwort auf die Frage