opencv rtsp流协议
opencv rtsp stream protocol
我想处理和显示从树莓派相机创建的网络 rtsp 流。
我有这个代码:
#include <iostream>
#include <functional>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main(int argc, char** argv) {
cv::VideoCapture * stream = new cv::VideoCapture("rtsp://192.168.55.151:8554/");
if (!stream->isOpened()) return -1;
cv::namedWindow("rtsp_stream", CV_WINDOW_AUTOSIZE);
cv::Mat frame;
while (true) {
if (!stream->read(frame)) return -1;
cv::imshow("rtsp_stream", frame);
cv::waitKey(15);
}
return 1;
}
当流不直播时,执行此结果:
[tcp @ 0xa12480] Connection to tcp://192.168.55.151:8554?timeout=0 failed: Connection refused
这意味着流尝试与 tcp 连接。直播时,执行结果为:
[rtsp @ 0xb07960] method SETUP failed: 461 Client error
从互联网研究我发现问题可能是流使用 udp。如果我将 URL 更改为:
"udp://192.168.55.151:8554/"
然后执行冻结在 cv::VideoCapture("udp://192.168.55.151:8554/");
VLC 能够打开 rtsp 流。据我了解,ffmpeg 用于使用 opencv 解码流。当我 运行:
ffmpeg -rtsp_transport udp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4
码流解码保存成功。
那么我如何在opencv代码中指定低层协议为udp呢?有没有其他方法可以用 opencv 做到这一点?
编辑:如果我将 ffmpeg 命令更改为使用 tcp,即:
ffmpeg -rtsp_transport tcp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4
然后我得到与 C++ 代码完全相同的错误,461 客户端错误
编辑:当代码使用 udp:// link 时,冻结大约 15 秒后,执行 returns 并出现错误
已在 github opencv 问题中得到解答。
问题是 opencv 强制 ffmpeg 使用 tcp 连接,而我的服务器使用 rtp 协议(udp 传输层)。
所以为了解决这个问题,我将服务器更改为http流。
试试这个代码,很容易解决你的问题
for(;;) {
if(!vcap.read(image)) {
std::cout << "No frame" << std::endl;
cv::waitKey();
}
cv::imshow("Output Window", image);
if(cv::waitKey(1) >= 0) break;
}
根据这个合并请求in opencv repo,你可以通过setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);
让OpenCV中的FFMPEG使用UDP协议
我想处理和显示从树莓派相机创建的网络 rtsp 流。 我有这个代码:
#include <iostream>
#include <functional>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main(int argc, char** argv) {
cv::VideoCapture * stream = new cv::VideoCapture("rtsp://192.168.55.151:8554/");
if (!stream->isOpened()) return -1;
cv::namedWindow("rtsp_stream", CV_WINDOW_AUTOSIZE);
cv::Mat frame;
while (true) {
if (!stream->read(frame)) return -1;
cv::imshow("rtsp_stream", frame);
cv::waitKey(15);
}
return 1;
}
当流不直播时,执行此结果:
[tcp @ 0xa12480] Connection to tcp://192.168.55.151:8554?timeout=0 failed: Connection refused
这意味着流尝试与 tcp 连接。直播时,执行结果为:
[rtsp @ 0xb07960] method SETUP failed: 461 Client error
从互联网研究我发现问题可能是流使用 udp。如果我将 URL 更改为:
"udp://192.168.55.151:8554/"
然后执行冻结在 cv::VideoCapture("udp://192.168.55.151:8554/");
VLC 能够打开 rtsp 流。据我了解,ffmpeg 用于使用 opencv 解码流。当我 运行:
ffmpeg -rtsp_transport udp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4
码流解码保存成功。 那么我如何在opencv代码中指定低层协议为udp呢?有没有其他方法可以用 opencv 做到这一点?
编辑:如果我将 ffmpeg 命令更改为使用 tcp,即:
ffmpeg -rtsp_transport tcp -i rtsp://192.168.55.151:8554/ -t 5 test.mp4
然后我得到与 C++ 代码完全相同的错误,461 客户端错误
编辑:当代码使用 udp:// link 时,冻结大约 15 秒后,执行 returns 并出现错误
已在 github opencv 问题中得到解答。 问题是 opencv 强制 ffmpeg 使用 tcp 连接,而我的服务器使用 rtp 协议(udp 传输层)。 所以为了解决这个问题,我将服务器更改为http流。
试试这个代码,很容易解决你的问题
for(;;) {
if(!vcap.read(image)) {
std::cout << "No frame" << std::endl;
cv::waitKey();
}
cv::imshow("Output Window", image);
if(cv::waitKey(1) >= 0) break;
}
根据这个合并请求in opencv repo,你可以通过setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);