临时接到这个需求,比较陌生,搜了很多资料,比如 libRTMP, rtmpdump等工具,最后发现原来 opencv的 VideoCapture 可以直接打开 RTMP视频流。
但是 直接去官网下载的 dll 却不行,看了下 VideoCapture 的构造函数,第二个入参有很多可选项,其中一个是 CAP_FFMPEG, 于是 把 OpenCV重新编译了下, 带上FFMPEG选项, 这下就成功了!非常简洁!
测试代码如下
void rtmpTest() {
string source = "rtmp://58.200.131.2:1935/livetv/hunantv";
//string source = "test.flv";
VideoCapture inputVideo(source, CAP_FFMPEG); // Open input
if (!inputVideo.isOpened())
{
cout << "Could not open the input video: " << source << endl;
return ;
}
int cnt = 0;
while (1)
{
Mat frame;
// Capture frame-by-frame
inputVideo >> frame;
cnt++;
std::cout << cnt << std::endl;
// If the frame is empty, break immediately
if (frame.empty())
break;
imshow("Frame", frame);
// Press ESC on keyboard to exit
char c = (char)waitKey(1);
if (c == 27)
break;
}
inputVideo.release();
}
实测发现 RTSP 的视频流也是可以的