我有一个 IP 网络摄像机,可以使用 TCP、UDP、RTSP 等流式传输 MJPEG、H.264 和其他。在我的客户端应用程序中,我需要访问此流以获取静止图像(捕获)或完整的视频流本身。
由于网络负载和延迟(获取最新图像),我更喜欢 RTSP。所以我尝试了 WPF 中的 MediaElement,但即使在 Stackoverflow 上的许多帖子的帮助下,我也无法让它运行。
任何帮助如何实现或应该使用哪个其他协议?
尝试使用库EmguCv。
在那里你可以通过 rtsp 连接。
我在这里的另一个线程/帖子中找到了解决方案。你会看到我只显示每 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;
}
}