gpt4 book ai didi

c++ - 使用 OpenCV 和 gstreamer 显示 RTSP 流

转载 作者:行者123 更新时间:2023-12-01 14:52:47 25 4
gpt4 key购买 nike

我购买了 IP camera我正在尝试使用 RTSP 连接。 RTSP 连接 URL 是 rtsp://admin:@192.168.0.27/channel=1&stream=0.554。我正在使用 OpenCV 打开并显示流:

#include <opencv2/opencv.hpp>

int main() {
cv::VideoCapture cap;
if (!cap.open("rtsp://admin:@192.168.0.27/channel=1&stream=0.554")) {
std::cout << "Unable to open video capture\n";
return -1;
}

while(true) {
cv::Mat frame;

auto ret = cap.grab();
cap >> frame;

if (frame.empty()) {
break; // End of video stream
}

cv::resize(frame, frame, cv::Size(640, 480));

// Do other stuff here with frame

cv::imshow("frame", frame);

if (cv::waitKey(10) == 27) {
break; // stop capturing by pressing ESC
}
}

return 0;
}

当我运行程序时,它会成功连接并显示几帧,但随后会开始严重滞后,通常会挂起并在崩溃前输出如下错误:

[h264 @ 0x558ae8e601a0] error while decoding MB 93 40, bytestream -11

我不确定为什么我在持续显示流时遇到问题。此外,当它能够显示流时,我发现它很快就会变得不同步(请注意,我正在对帧进行一些繁重的处理,这会花费很多时间)。与此一样,它没有显示实时时间范围,但延迟越来越大。

我怎样才能确保使用“最新”的帧,并丢弃所有其他可能已经积累在某个缓冲区中的帧。另外,关于它崩溃的原因以及我如何改进流媒体有什么想法吗?

我找到了 this SO 帖子处理使用 gstreamer 获取最新帧。当我修改我的视频捕获字符串以使用 gstreamer 时,它的效果会好一些。

这里是修改后的连接字符串:"rtspsrc location=rtsp://admin:@192.168.0.27/channel=1&stream=0.554 !decodebin !videoconvert !appsink max-buffers=1 drop=true"

我没有使用 gstreamer 的经验,所以我不确定它在做什么,但它似乎有所改善。但是,有一段时间,它会全部变灰,只有在有运动时才会显示像素,如下图所示。根据我在编解码器方面的经验,我相信引用框架丢失了,但我不太确定。有想法该怎么解决这个吗?如果我没有使用正确的 gstreamer 参数,请就我应该使用什么进行快速流式传输提出建议(始终使用最新的帧)。正如我提到的,我对 gstreamer 的经验很少。感谢您的帮助!

enter image description here enter image description here

最佳答案

这可能是网络传输丢包造成的。您可以尝试修改 URL 以使用 rtspt:// 协议(protocol)。这将尝试建立 TCP 传输,以防止接收方发生数据包丢失。

关于c++ - 使用 OpenCV 和 gstreamer 显示 RTSP 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61647984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com