我有一臺IP攝像機,從中可以得到一些圖片。首先我只想讀一個jpeg。由於所有通信都是通過http完成的,因此我使用libcurl。所以我的代碼看起來很簡單,像這樣:從libcurl提供的流中讀取jpeg
// 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流爲FILESTREAM。現在,這實際工作:
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));
}
這不工作....?
問候
托比亞斯
「它不起作用,因爲普通文件流不能理解jpeg。」它需要了解什麼?如果你用二進制模式寫入文件擴展名爲.jpg不起作用?或者,您是否在沒有JFIF標題的情況下獲取數據?或希望首先以某種方式處理文件?還是它給你一個連續的流,你需要切成個人的圖像或其他東西? – Rup 2012-01-10 10:20:02
哦,有時候,我覺得我不應該在清晨早些時候工作 - 我可以(當我只是得到一張照片時)將所有流轉儲到文件中。但是我沒有注意到其他東西(只是要在上面的問題中指定它) – Toby 2012-01-10 10:28:13
您的write_test回調函數對我來說看起來不錯,因爲除了通過調用'fwrite'完全相同的參數。難道是因爲'write_test'是一個C++函數,你需要以某種方式將它聲明爲一個C函數(即在'extern「C」{}'塊中)?我不知道C++。 – Celada 2012-01-10 10:38:06