最佳实践如何显示/接收IP网络摄像机流

时间:2013-06-03 12:09:40

标签: c# streaming rtsp ip-camera

我有一台IP网络摄像机,可以使用TCP,UDP,RTSP等流式传输MJPEG,H.264等。在我的客户端应用程序中,我需要访问此流以获取静态图像(捕获)或完整的视频流本身。

由于网络负载和延迟(为了获得最新的图像),我更喜欢RTSP。所以我尝试了WPF中的MediaElement,但即使在Stackoverflow上的许多帖子的帮助下,我都没有设法让它运行。

有关如何实现该协议或使用其他协议的任何帮助?

2 个答案:

答案 0 :(得分:0)

尝试使用库EmguCv

你可以通过rtsp连接。

答案 1 :(得分:0)

我在这里找到了另一个thread/post的解决方案。你会看到我只显示每10帧。这是因为帧被接收得如此之快,即imsh​​ow(...)将显示被破坏/扭曲的图像。如果你只提供每第10帧imshow(...),结果将是正常的。如果IP摄像机以30fps的速度提供1080p,我必须每隔30帧或40帧显示一次。

#include "cv.h"
#include "highgui.h"
#include <iostream>

int main(int, char**) {
    cv::VideoCapture vcap;
    cv::Mat image;

    const std::string videoStreamAddress = "rtsp://cam_address:554/live.sdp"; 
    /* it may be an address of an mjpeg stream, 
    e.g. "http://user:pass@cam_address:8081/cgi/mjpg/mjpg.cgi?.mjpg" */

    //open the video stream and make sure it's opened
    if(!vcap.open(videoStreamAddress)) {
        std::cout << "Error opening video stream or file" << std::endl;
        return -1;
    }

    int counter = 0;
    for(;;) {
        counter++;

        if(!vcap.read(image)) {
            std::cout << "No frame" << std::endl;
            cv::waitKey();
        }

        // if the picture is too large, imshow will display warped images, so show only every 10th frame
        if (counter % 10 != 0)
            continue;

        cv::imshow("Output Window", image);
        if(cv::waitKey(1) >= 0) break;
    }   
}