2015-10-11 3 views
3

Я хочу создать Http-сервер для отправки потока MJPEG. Я уже могу отправить изображение, но без Live-Stream.Как создать потоковый сервер HTTP MJPEG с сокетами QTcp-Server?

Что я сделал: Создал TCP-сервер. При создании клиента подключается TCP-Socket. Затем я реализовал ReadyRead SLOT, которые выполняются, когда браузер отправляет запрос «GET» на сервер.

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

Затем я запускаю следующий код

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(); 

Я думал о создании цикла повторить изображение Streaming Часть , но это не работает. Браузер Просто сохраняет загрузку и ничего не происходит ....

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); 
} 

Что мне не хватает? Неправильно ли кодирование или способ обращения с запросом? Возможно, мим-типы?


Update Я посмотрел на
http://www.damonkohler.com/2010/10/mjpeg-streaming-protocol.html и https://en.wikipedia.org/wiki/Motion_JPEG и попытались реализовать тезисы методы, но без каких-либо результатов ....

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(); 

ответ

2

Я решил это сам. ... Мне просто пришлось отрегулировать некоторые вещи, выпущенные Протоколом ....

m_TcpHttpClient->readAll(); // Discard "Get Request String" 

QByteArray ContentType = ("HTTP/1.0 200 OK\r\n" \ 
          "Server: en.code-bude.net example server\r\n" \ 
          "Cache-Control: no-cache\r\n" \ 
          "Cache-Control: private\r\n" \ 
          "Content-Type: multipart/x-mixed-replace;boundary=--boundary\r\n\r\n"); 

m_TcpHttpClient->write(ContentType); 


while(1){ 

    // Image to Byte Array via OPENCV Method 
    std::vector<uchar> buff; 
    imencode(".jpg",m_VisualEngine->GetActualFrame(),buff); 
    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"); 

    m_TcpHttpClient->write(BoundaryString); 
    m_TcpHttpClient->write(CurrentImg); // Write The Encoded Image 

    m_TcpHttpClient->flush(); 
} 
+0

Я пробовал вышеуказанный код, но он выдает сообщение об ошибке. Любая помощь? – FadedCoder

+0

Пожалуйста, дайте мне информацию об ошибках, которые вы получаете –

+0

@MichaelRamph Вот вопрос, содержащий ошибку - http://stackoverflow.com/questions/37025383/ – FadedCoder

 Смежные вопросы

  • Нет связанных вопросов^_^