我的目标是每秒钟从rtmp流中捕获一个帧,并使用OpenCV处理它。我在用FFmpeg接口使用OpenCV版本N-71899-g6ef3426和OpenCV 2.4.9 (但我第一次尝试使用OpenCV)。目前,我只能采用简单而肮脏的解决方案,即使用FFmpeg捕获图像,将它们存储在磁盘中,然后从我的OpenCV程序中读取这些图像。这是我使用的FFmpeg命令:
ffmpeg -i "rtmp://antena3fms35livefs.fplive.net:1935/antena3fms35live-live/stream-lasexta_1 live=1" -r 1 capImage%03d.jpg这是目前我的工作,至少这个具体的rtmp源代码。然后,我需要以适当的方式从我的OpenCV程序中读取这些图像。我并没有真正实现这个部分,因为我正在试图找到一个更好的解决方案。
我认为理想的方法是直接从OpenCV捕获rtmp帧,但我找不到方法。这是我使用的Python中的代码:
cv2.namedWindow("camCapture", cv2.CV_WINDOW_AUTOSIZE)
cap = cv2.VideoCapture()
cap.open('"rtmp://antena3fms35livefs.fplive.net:1935/antena3fms35live-live/stream-lasexta_1 live=1"')
if not cap.open:
print "Not open"
while (True):
err,img = cap.read()
if img and img.shape != (0,0):
cv2.imwrite("img1", img)
cv2.imshow("camCapture", img)
if err:
print err
break
cv2.waitKey(30)除了read()函数之外,我还尝试使用grab()和检索()函数,但没有取得任何好的结果。每次都执行read()函数,但是没有接收到"img“或"err”。还有别的办法吗?或者没有办法从这样的流中直接从OpenCV 2.4.9获取帧?
我读过OpenCV使用FFmpeg来执行此类任务,但正如您所看到的,在我的示例中,FFmpeg能够从流中获取帧,而OpenCV则不能。
在我无法找到直接从OpenCV获取框架的方法时,我的下一个想法是以某种方式将FFmpeg输出输送到OpenCV,这似乎很难实现。
知道了吗,谢谢!
更新1:我在Windows8.1中。由于我是从Eclipse运行python脚本的,所以这次我从cmd运行它,并收到以下警告:
warning: Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:545)据我所知,这个警告意味着要么文件路径错误,要么不支持编解码器。现在,问题是一样的。OpenCV不能从这个源获取帧吗?
发布于 2015-08-27 12:24:36
事实上,有一天我花了更多的时间想办法解决这个问题。最后,我在此链接的帮助下解决了这个问题。这是客户端代码。
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int, char**) {
cv::VideoCapture vcap;
cv::Mat image;
const std::string videoStreamAddress = "rtmp://192.168.173.1:1935/live/test.flv";
if(!vcap.open(videoStreamAddress)) {
std::cout << "Error opening video stream or file" << std::endl;
return -1;
}
cv::namedWindow("Output Window");
cv::Mat edges;
for(;;) {
if(!vcap.read(image)) {
std::cout << "No frame" << std::endl;
cv::waitKey();
}
cv::imshow("Output Window", image);
if(cv::waitKey(1) >= 0) break;
}
}注意:在本例中,我创建了一个用于获取实时视频并将其发送到rtmp服务器沃扎的android应用程序,该服务器部署在PC.So中,也就是我为实时视频处理创建这个c++实现的地方。
发布于 2017-06-13 06:45:47
python -c "import cv2; print(cv2.getBuildInformation())" 检查使用ffmpeg构建opencv。如果它是正确的,您的代码应该是好的。

如果不是,用ffmpeg重建opencv。osx下
brew install opencv --with-ffmpeghttps://stackoverflow.com/questions/30096327
复制相似问题