想要把之前的專題架設在RPI
原本要從廠商提供的SDK向DVR主機
拉H264串流下來解碼成圖片做處理
可是!
他沒有提供ARM的動態函式庫...
(虧我還花了一天找RPI硬解H264)
所以尋找替代方案!
所幸DVR提供網頁線上瀏覽
直接抓圖下來
連轉檔都省下來了!!
再拉圖下來有Authorization問題
要輸入帳號密碼才能登入下載
有兩種解法
以我這邊的DVR網址為例
原網址為
http://127.0.0.1/cgi-bin/net_jpeg.cgi?ch=0
第一種
再前面加入"帳號:密碼@"如下
http://user:pass@127.0.0.1/cgi-bin/net_jpeg.cgi?ch=0
第二種
再Header 自己添加Authorization
headers = curl_slist_append(headers,"Authorization: Basic XXXXXXXXXXX");
XXXXXXXXXXX為 user:pass 進行 base64運算結果
詳情參考WIKI:HTTP基本認證
後記:
再抓DVR的圖時間耗費的很久
原本以為是keep-alive的問題減少握手次數因該可以加快速度
我還以為是我程式碼寫錯
結果DVR主機不支援........
而花費的時間大都再內部的轉檔吧!(猜測)
使用範例multi-app
去同時抓圖下來(16張)
大概花費2秒
比原本一張1秒好多了
不過同時抓有時候程式會卡住...
不知道是主機來不及反應還是網路塞車了
下面程式碼使用QT且只能單張下載
可以參考multi-app修改
dlimage.h
dlimage.cpp
原本要從廠商提供的SDK向DVR主機
拉H264串流下來解碼成圖片做處理
可是!
他沒有提供ARM的動態函式庫...
(虧我還花了一天找RPI硬解H264)
所以尋找替代方案!
所幸DVR提供網頁線上瀏覽
直接抓圖下來
連轉檔都省下來了!!
再拉圖下來有Authorization問題
要輸入帳號密碼才能登入下載
有兩種解法
以我這邊的DVR網址為例
原網址為
http://127.0.0.1/cgi-bin/net_jpeg.cgi?ch=0
第一種
再前面加入"帳號:密碼@"如下
http://user:pass@127.0.0.1/cgi-bin/net_jpeg.cgi?ch=0
第二種
再Header 自己添加Authorization
headers = curl_slist_append(headers,"Authorization: Basic XXXXXXXXXXX");
XXXXXXXXXXX為 user:pass 進行 base64運算結果
詳情參考WIKI:HTTP基本認證
後記:
再抓DVR的圖時間耗費的很久
原本以為是keep-alive的問題減少握手次數因該可以加快速度
我還以為是我程式碼寫錯
結果DVR主機不支援........
而花費的時間大都再內部的轉檔吧!(猜測)
使用範例multi-app
去同時抓圖下來(16張)
大概花費2秒
比原本一張1秒好多了
不過同時抓有時候程式會卡住...
不知道是主機來不及反應還是網路塞車了
下面程式碼使用QT且只能單張下載
可以參考multi-app修改
dlimage.h
#ifndef DIMAGE_H
#define DIMAGE_H
#include <curl/curl.h>
#include <QString>
#include <QImage>
class DLimage
{
public:
DLimage(QString srcUrl);
public:
bool ChangeUrl(QString srcUrl);
bool DownloadJpeg();
QImage& GetImage();
private:
QString srcUrl;
QByteArray tempfile ;
QImage newImage;
};
#endif // DIMAGE_H
dlimage.cpp
#include "dlimage.h"
#include<iostream>
#include<QImageReader>
#include <QBuffer>
DLimage::DLimage(QString srcUrl)
{
this->srcUrl=srcUrl;
}
bool DLimage::ChangeUrl(QString srcUrl)
{
this->srcUrl=srcUrl;
return true;
}
size_t callbackfunction(void *ptr, size_t size, size_t nmemb, void* userdata)
{
int len= size*nmemb;
QByteArray *tempfile =(QByteArray*) userdata;
tempfile->append(QByteArray((char*)ptr,nmemb));
return len;
}
bool DLimage::DownloadJpeg()
{
CURL* curlCtx = curl_easy_init();
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers,"Connection:keep-alive");
headers = curl_slist_append(headers,"Authorization: Basic XXXXXXXXXXX"); //base64
curl_easy_setopt(curlCtx, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curlCtx, CURLOPT_URL,srcUrl.toLocal8Bit().constData());
curl_easy_setopt(curlCtx, CURLOPT_WRITEDATA,&tempfile);
curl_easy_setopt(curlCtx, CURLOPT_WRITEFUNCTION, callbackfunction);
curl_easy_setopt(curlCtx, CURLOPT_FOLLOWLOCATION, 1);
CURLcode rc = curl_easy_perform(curlCtx);
if (rc)
{
std::cout<<"!!! Failed to download: "<<srcUrl.toLocal8Bit().constData()<<std::endl;
return false;
}
long res_code = 0;
curl_easy_getinfo(curlCtx, CURLINFO_RESPONSE_CODE, &res_code);
if (!((res_code == 200 || res_code == 201) && rc != CURLE_ABORTED_BY_CALLBACK))
{
std::cout<<"!!! Response code: "<<res_code<<std::endl;
return false;
}
curl_easy_cleanup(curlCtx);
curl_slist_free_all(headers);
headers = NULL;
//save Image from QByteArray
QBuffer buffer(&tempfile);
buffer.open( QIODevice::ReadOnly);
QImageReader reader(&buffer);
newImage = reader.read();//Copy
buffer.close();
tempfile.clear();
return true;
}
QImage& DLimage::GetImage()
{
return newImage;
}
留言
張貼留言