上篇介紹過了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
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地址和格式
視頻碼率、幀率和分辨率的聯繫與區別(基礎知識)