Как для потокового воспроизведения JPEG с использованием CGI? - PullRequest
0 голосов
/ 30 января 2019

Я создаю веб-приложение, которое должно отображать видео, которое я получаю с высокоскоростной камеры.Для этого я пытаюсь создать приложение Motion JPEG CGI, которое просто выводит эти кадры в виде последовательности JPG, когда браузер обращается к этому приложению CGI.

Итак, мой вопрос: как я могу создать простой код C ++которые просто читают последовательность файлов JPG, а затем печатают ее вывод в другом, чтобы загрузить в браузер последовательность JPG?

Я пробовал следующий код, но он не работает ...

#include <iostream>
#include <cstdio>

int main()
{
    std::cout << "Cache-Control: no-cache\n\n";
    std::cout << "Cache-Control: private\n\n";
    std::cout << "Pragma: no-cache\n\n";
    std::cout << "Content-type: multipart/x-mixed-replace; boundary=spiderman\n\n";

    int i = 0;
    while(true)
    {
        char buffer[1024];
        sprintf(buffer, "/tmp/img_%d.jpg", (i%2));
        FILE* fp = fopen(buffer, "r");
        while(!feof(fp))
        {
            fread(buffer, 1, 1, fp); 
            fwrite(buffer, 1, 1, stdout);
        }
        fclose(fp);
        i++;
        std::cout << "--spiderman\n";
        std::cout << "Content-type: image/jpeg\n\n";
    }
}

1 Ответ

0 голосов
/ 31 января 2019

После очень сложной бинарной отладки мне удалось найти простое решение:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>

int main()
{
    printf("Content-Type: multipart/x-mixed-replace; boundary=--jpgboundary\r\n\r\n");

    int i = 0;
    while(true)
    {
        char fnameBuffer[1024];
        sprintf(fnameBuffer, "/tmp/img_%d.jpg", (i%2));
        FILE* fp = fopen(fnameBuffer, "r");
        fseek(fp, 0, SEEK_END);
        long fileSize = ftell(fp);
        rewind(fp);

        char* buffer = (char*)malloc(sizeof(char)*fileSize);
        fread(buffer, 1, fileSize, fp);
        fclose(fp);
        free(buffer);

        i++;
        printf("--jpgboundary");
        printf("Content-type: image/jpeg\r\n");
        printf("Content-length: %ld\r\n\r\n", fileSize);
        fwrite(buffer, 1, fileSize, stdout);
        printf("\r\n\r\n\r\n");

        usleep(1000);
    }
}

Это фактически загружает последовательность изображений и сбрасывает их в браузер.Я протестировал вывод с помощью Google Chrome, и он работает как положено.

...