gpt4 book ai didi

c++ - 如何使用 CGI 流式传输 motion jpeg?

转载 作者:行者123 更新时间:2023-11-28 04:25:29 26 4
gpt4 key购买 nike

我正在创建一个 Web 应用程序,它需要显示我从高速摄像机抓取的视频。为此,我正在尝试创建一个 Motion JPEG CGI 应用程序,当浏览器访问此 CGI 应用程序时,它仅将这些帧输出为 JPG 序列。

所以我的问题是:我如何创建一个简单的 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";
}
}

最佳答案

经过非常艰苦的二进制调试,我想出了一个简单的解决方案:

#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 测试了输出,它按预期工作。

关于c++ - 如何使用 CGI 流式传输 motion jpeg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54442029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com