私は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);
私はもう2つのことが必要であることをよく知っています。コールバック関数(write_test)を宣言して定義する必要があり、パラメータCURLOPT_WRITEDATAを指定してcurl_easy_setopt()を呼び出してストリームを渡す必要があります。
ここで私はこれを行う方法がわかりません。通常のファイルストリームを手渡してファイルに書き込むと(通常のテキストのように)、通常のファイルストリームはjpegを理解できないため動作しません。
どうすればよいですか? "libjpeg"のような追加のライブラリが必要ですか?そして私はその川でどのように働くでしょうか?
//編集:私はだけファイルストリームに1枚の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));
}
これは....動作しませんか?
よろしく
トビアス
"通常のファイルストリームはjpegを理解できないため動作しません。"何を理解する必要がありますか?拡張子が.jpgのバイナリモードでファイルを書き出すと、それは機能しません。あるいは、JFIFヘッダなしでデータを取得していますか?またはファイルを何らかの方法で最初に処理したいと思っていますか?それとも、個々のイメージにカットするために必要な連続的な流れを与えるか、それとも何か他のものを与えるのですか? – Rup
オハイオ州の男、時々私は早朝にこれを動作させるべきではないと感じています - 私が(私がただ一つの写真を撮ると)すべてのストリームをファイルにダンプすることができます。しかし、私は別のことに気付かなかった(上記の質問でそれを指定する) – Toby
write_testコールバック関数は、受け取ったものと全く同じパラメータで 'fwrite'を呼び出す以外に何もしない限り、私には似ています。 'write_test'がC++関数であり、何らかの形でC関数(つまり' extern "C" {} 'ブロック)として宣言する必要があるからでしょうか?私はC++を知らない。 – Celada