У меня есть 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), и мне нужно вызвать curl_easy_setopt () с параметром CURLOPT_WRITEDATA и передать ему поток.
Теперь это тот случай, когда я не уверен, как это сделать. Если я просто передам ему обычный файловый поток и запишу весь материал в файл (как будто это был просто текст), он не будет работать, так как обычный файловый поток не понимает 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));
}
Это не работает ....?
С наилучшими пожеланиями
Tobias