C++網絡攝像頭數據的獲取與顯示 (續)

上篇介紹過了vlc對於網絡攝像頭數據的獲取,繼續上篇介紹opencv獲取攝像頭數據


OpenCV是一個強大的計算機視覺庫,而不是視頻流編碼器或者解碼器。希望大家不要走入這個誤區,可以把這部分簡單單獨看待。目前,OpenCV只支持avi的格式,而且生成的視頻文件不能大於2GB,而且不能添加音頻。如果你想突破這些限制,我建議你最好還是看看ffMpeg,而不是浪費時間在OpenCV上。不過也可以利用視頻後期合成工具製作。
對於opencv也是剛剛學習,其中在視頻這方面可以使用兩種VideoWriter類或者CvCapture類。

類使用方法

使用
VideoCapture cv::VideoCapture vcap(“C:/115.avi”);
CvCapture CvCapture* capture = cvCreateFileCapture(“C:/115.avi”);

個人感覺這兩種似乎差不多,均可讀取網絡數據和本地視頻數據;
閒話少敘繼續網絡攝像頭數據的獲取;

const std::string videoStreamAddress = "rtsp://admin:[email protected]:554/cam/realmonitor?channel=1&subtype=0";//或者本地文件路徑;
cv::VideoCapture vcap;
if(!vcap.open(videoStreamAddress)) {
        std::cout << "Error opening video stream or file" << std::endl;
    }
    cv::namedWindow("Output Window");
    for(;;) {
        if(!vcap.read(image1)) {
            std::cout << "No frame" << std::endl;
            cv::waitKey();
        }
        cv::imshow("Output Window", image1);
        if(cv::waitKey(1) >= 0) break;
    }   
    std::cout<<"\nend image show\n"<<std::endl;

或者

CvCapture *camera=cvCaptureFromFile("http://admin:admin@192.168.1.115/axis-cgi/mjpg/video.cgi?resolution=1280x720&req_fps=30&.mjpg");//http;
//CvCapture *camera = cvCreateFileCapture("rtsp://admin:admin@192.168.1.115:554");//rtsp流;
if (camera==NULL)
    printf("camera is null\n");
else
    printf("camera is not null");

cvNamedWindow("img");
while (cvWaitKey(10)!=atoi("q")){
    double t1=(double)cvGetTickCount();
    IplImage *img=cvQueryFrame(camera);
    double t2=(double)cvGetTickCount();
    printf("time: %gms  fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));
    cvShowImage("img",img);//顯示視頻圖像;
}
cvReleaseCapture(&camera);

這兩種方式,使用上感覺差別不是太大。
對於延遲性問題,這個跟網路和所選擇的協議相關,如上篇文章所述,vlc有將近不到1s的延遲,用opencv來獲取rtsp流或http協議也是不錯的選擇。但如上篇所述,也會有各種的問題,如http剛開始時,會有視頻的卡頓(也可以理解爲延遲);rtsp會造成花影,同時延遲性並不比vlc好(但不會出現vlc那樣中間變灰的情況),因爲opencv使用ffmpeg庫解析rtsp等等,但是至少h264視頻解碼錯誤。
Console:(控制檯輸出類似錯誤)
[h264 @ 00000000030afaa0] error while decoding MB 59 10, bytestream (-9)
[h264 @ 00000000055e7420] left block unavailable for requested intra4x4 mode -1 at 0 14
opencv中FFMPEG對h264編碼有些問題
ip camera h264 error while decoding的解決嘗試
how to stream h264 video with rtsp in opencv- partially answered
根據這兩個鏈接嘗試過GStreamer和vlc,GStreamer未嘗試成功,期待小夥伴們的成功。
攝像頭產品,有各種連接方式,如http、tcp、udp、rtsp等等
大華攝像頭的連接
該扯的都扯完了,如有錯誤請多多指教。接着整理代碼,儘快上傳;
可以參考一些網絡攝像頭rtsp地址格式:
IPC網絡攝像頭常見傳輸協議(rtsp協議,udp協議)介紹
海康大華IPCamera RTSP地址和格式
視頻碼率、幀率和分辨率的聯繫與區別(基礎知識)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章