[英]OpenCV - Streaming H264 over RTSP using FFMPEG in version 3.4
I am trying to capture an RTSP
stream from a VIRB 360 camera, into OpenCV
. 我正在尝试将VIRB 360摄像机的
RTSP
流捕获到OpenCV
。 The video is H264
and according to one of the comments here , OpenCV 3.4
should be able to handle it. 该视频为
H264
,根据此处的评论之一, OpenCV 3.4
应该可以处理它。 Here is the code: 这是代码:
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
int main()
{
cv::VideoCapture cap("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);
if(!cap.isOpened())
{
std::cout << "Input error\n";
return -1;
}
cv::namedWindow("Video Feed", cv::WINDOW_AUTOSIZE);
cv::Mat frame;
for(;;)
{
//std::cout << "Format: " << cap.get(CV_CAP_PROP_FORMAT) << "\n";
cap >> frame;
cv::imshow("Video Feed", frame);
if (cv::waitKey(10) == 27)
{
break;
}
}
cv::destroyAllWindows();
return 0;
}
I have compiled OpenCV
with ffmpeg
and gstreamer
capabilities. 我已经用
ffmpeg
和gstreamer
功能编译了OpenCV
。 When I run the following Gstreamer
command, I am able to stream it, but with a delay of 3 seconds (not acceptable): 当我运行以下
Gstreamer
命令时,我可以流式传输它,但要延迟3秒(不可接受):
gst-launch-1.0 playbin uri=rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720\&liveStreamActive=1
On the other hand, I get a 0.5 second delay using ffplay/ffmpeg
command (acceptable): 另一方面,我使用
ffplay/ffmpeg
命令得到了0.5秒的延迟(可以接受):
ffplay -fflags nobuffer -rtsp_transport udp rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720\&liveStreamActive=1
or 要么
ffplay -probesize 32 -sync ext rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720\&liveStreamActive=1
In the OpenCV
code written above, using cv::CAP_FFMPEG
flag in the line: 在上面编写的
OpenCV
代码中,在以下行中使用cv::CAP_FFMPEG
标志:
cv::VideoCapture cap("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);
gives the error: 给出错误:
[rtsp @ 0x2312040] The profile-level-id field size is invalid (65)
[rtsp @ 0x2312040] method SETUP failed: 461 Unsupported transport
Input error
If I use cv::CAP_GSTREAMER
, it throws no error, but nothing happens. 如果我使用
cv::CAP_GSTREAMER
,它不会引发任何错误,但是什么也不会发生。 I believe that the problem is that OpenCV
is not able to handle UDP
transport layer. 我认为问题在于
OpenCV
无法处理UDP
传输层。 What are the possible solutions? 有什么可能的解决方案? Kindly provide suggestions.
请提供建议。
Edit 1: I was able to get capture the stream by following this . 编辑1:通过执行此操作,我能够捕获流。 I made the following changes: instead of
cv::VideoCapture cap("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);
我进行了以下更改:而不是
cv::VideoCapture cap("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);
the code now has: 该代码现在具有:
#if WIN32
_putenv_s("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp");
#else
setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);
#endif
auto cap = cv::VideoCapture("rtsp://192.168.0.1/livePreviewStream?maxResolutionVertical=720&liveStreamActive=1", cv::CAP_FFMPEG);
#if WIN32
_putenv_s("OPENCV_FFMPEG_CAPTURE_OPTIONS", "");
#else
unsetenv("OPENCV_FFMPEG_CAPTURE_OPTIONS");
#endif
However, it throws the following errors: 但是,它引发以下错误:
[rtsp @ 0x2090580] The profile-level-id field size is invalid (65)
[rtsp @ 0x2090580] Error parsing AU headers
[h264 @ 0x208d240] error while decoding MB 69 40, bytestream -7
[rtsp @ 0x2090580] Error parsing AU headers
[rtsp @ 0x2090580] Error parsing AU headers
[h264 @ 0x2316700] left block unavailable for requested intra4x4 mode -1
[h264 @ 0x2316700] error while decoding MB 0 16, bytestream 112500
[rtsp @ 0x2090580] Error parsing AU headers
which means the video is sometimes glitchy and looks like: 这意味着视频有时会出现故障,看起来像:
I believe it has something to do with: 我认为这与以下方面有关:
setenv("OPENCV_FFMPEG_CAPTURE_OPTIONS", "rtsp_transport;udp", 1);
I would appreciate any suggestions or improvements. 我将不胜感激任何建议或改进。 Thank You.
谢谢。
Set this: 设置此:
cv::VideoCapture cap;
cap.set(CV_CAP_PROP_BUFFERSIZE, 3); /
I think this was answered here. 我认为这里已经回答了。 OpenCV VideoCapture lag due to the capture buffer
由于捕获缓冲区导致OpenCV VideoCapture滞后
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.