C++网络摄像头数据的获取与显示 (续)

上篇介绍过了vlc对于网络摄像头数据的获取,继续上篇介绍opencv获取摄像头数据

OpenCV是一个强大的计算机视觉库,而不是视频流编码器或者解码器。希望大家不要走入这个误区,可以把这部分简单单独看待。目前,OpenCV只支持avi的格式,而且生成的视频文件不能大于2GB,而且不能添加音频。如果你想突破这些限制,我建议你最好还是看看ffMpeg,而不是浪费时间在OpenCV上。不过也可以利用视频后期合成工具制作。
对于opencv也是刚刚学习,其中在视频这方面可以使用两种VideoWriter类或者CvCapture类。

类使用方法

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

个人感觉这两种似乎差不多,均可读取网络数据和本地视频数据;
闲话少叙继续网络摄像头数据的获取;

const std::string videoStreamAddress = "rtsp://admin:admin@192.168.1.115: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
《C++网络摄像头数据的获取与显示 (续)》
ip camera h264 error while decoding的解决尝试
how to stream h264 video with rtsp in opencv- partially answered
根据这两个链接尝试过GStreamer和vlc,GStreamer未尝试成功,期待小伙伴们的成功。
摄像头产品,有各种连接方式,如http、tcp、udp、rtsp等等
《C++网络摄像头数据的获取与显示 (续)》
该扯的都扯完了,如有错误请多多指教。接着整理代码,尽快上传;
可以参考一些网络摄像头rtsp地址格式:
IPC网络摄像头常见传输协议(rtsp协议,udp协议)介绍
海康大华IPCamera RTSP地址和格式
视频码率、帧率和分辨率的联系与区别(基础知识)

    原文作者:stonels01
    原文地址: https://blog.csdn.net/stonels01/article/details/52034252
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞