c++ - 从 libcurl 提供的流中读取 jpeg

标签 c++ http jpeg libcurl

我有一个 IP 摄像机(哦,惊喜)我想从中获取一些照片。一开始我只想读一张 jpeg。由于所有通信都是通过 http 完成的,所以我使用的是 libcurl。所以我的代码看起来很简单,像这样:

// Initialize some stuff
CURL * curl;
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.147/cgi-bin/mjpeg?mode=single");    curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, write_test);

现在我很清楚我还需要两件事。我需要声明和定义回调函数 ( write_test ),我需要用参数 CURLOPT_WRITEDATA 调用 curl_easy_setopt() 并给他一个流。

在这种情况下,我不确定如何执行此操作。如果我只是给他一个普通的文件流并将所有内容写入一个文件(就像它只是一些文本)它就不会工作,因为普通的文件流不理解 jpeg。

我该怎么做?我需要像“libjpeg”这样的额外库吗?我将如何使用流?

//编辑:

好的,如前所述,我可以将一个 jpeg 流转储到文件流中。现在这确实有效:

FILE* pFile = fopen("/home/username/test.jpeg","w");
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.147/cgi-bin/mjpeg?mode=single");
//curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, write_test);
curl_easy_setopt(curl,CURLOPT_WRITEDATA, pFile);
curl_easy_perform(curl);

如果我不声明回调函数它工作正常 - 但如果我不注释掉 CURLOP_WRITEFUNCTION 并自行声明回调函数,我不会得到好的结果。

->

size_t write_test(void *ptr, size_t size, size_t nmeb, void *stream)
{
    return fwrite(ptr,size,nmeb,static_cast<FILE*>(stream));
}

这行不通....?

最好的问候

托比亚斯

最佳答案

你是想把它转储到磁盘上的文件中,还是想把它接收到内存缓冲区(或数据库,或其他任何东西)?无论哪种方式,cURL 都能为您提供帮助。如果你想把它放在一个文件中,那么你可以像你所说的那样使用 CURLOPT_WRITEDATA 而无需设置任何 CURLOPT_WRITEFUNCTION。如果你想把它放在内存缓冲区中,那么你必须同时提供 CURLOPT_WRITEDATACURLOPT_WRITEFUNCTION,后者是指向你编写的函数的指针,该函数接受来自远程服务器并将其存储在某个地方。

一旦获得 JPEG,您想做什么?如果我理解正确的话,这似乎超出了您的问题范围,并且与 cURL 无关。 “libjpeg”确实可以帮助你。

关于c++ - 从 libcurl 提供的流中读取 jpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8801536/

相关文章:

c++ - 始终在不同的 .so 中内联函数

c++ - STL vector 的默认构造函数

security - 如何修复 HTTP 协议(protocol)规范中的 CSRF?

.net - 以编程方式选择图像转换格式为 JPEG 或 PNG 以用于 Silverlight 显示

PHP 图像处理 GD JPEG 质量

c++ - Boost::filesystem::is_symlink() 不起作用

带尾递归的 C++ 快速排序

http - 没有 SAP 的 SAP OCI 集成

javascript - 使用 Javascript 加载非 HTML 内容。是否可以?

image - 如何将 JPEG 转换为 EXIF 方向为 1 的 JPEG?