0

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

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

任何帮助如何实现或应该使用哪个其他协议?

4

2 回答 2

0

尝试使用库EmguCv

在那里你可以通过 rtsp 连接。

于 2013-06-17T14:43:16.873 回答
0

我在这里的另一个线程/帖子中找到了解决方案。你会看到我只显示每 10 帧。这是因为帧的接收速度非常快,以至于 imshow(...) 将显示损坏/扭曲的图像。如果您只向 imshow(...) 提供每 10 帧,结果就可以了。如果 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;
    }   
}
于 2013-06-21T12:27:16.820 回答