首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV不会从RTMP源捕获帧,而FFmpeg会捕获

OpenCV不会从RTMP源捕获帧,而FFmpeg会捕获
EN

Stack Overflow用户
提问于 2015-05-07 08:56:15
回答 2查看 10.5K关注 0票数 7

我的目标是每秒钟从rtmp流中捕获一个帧,并使用OpenCV处理它。我在用FFmpeg接口使用OpenCV版本N-71899-g6ef3426和OpenCV 2.4.9 (但我第一次尝试使用OpenCV)。目前,我只能采用简单而肮脏的解决方案,即使用FFmpeg捕获图像,将它们存储在磁盘中,然后从我的OpenCV程序中读取这些图像。这是我使用的FFmpeg命令:

代码语言:javascript
复制
ffmpeg -i "rtmp://antena3fms35livefs.fplive.net:1935/antena3fms35live-live/stream-lasexta_1 live=1" -r 1 capImage%03d.jpg

这是目前我的工作,至少这个具体的rtmp源代码。然后,我需要以适当的方式从我的OpenCV程序中读取这些图像。我并没有真正实现这个部分,因为我正在试图找到一个更好的解决方案。

我认为理想的方法是直接从OpenCV捕获rtmp帧,但我找不到方法。这是我使用的Python中的代码:

代码语言:javascript
复制
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运行它,并收到以下警告:

代码语言:javascript
复制
warning: Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:545)

据我所知,这个警告意味着要么文件路径错误,要么不支持编解码器。现在,问题是一样的。OpenCV不能从这个源获取帧吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-27 12:24:36

事实上,有一天我花了更多的时间想办法解决这个问题。最后,我在此链接的帮助下解决了这个问题。这是客户端代码。

代码语言:javascript
复制
    #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++实现的地方。

票数 8
EN

Stack Overflow用户

发布于 2017-06-13 06:45:47

代码语言:javascript
复制
python -c "import cv2; print(cv2.getBuildInformation())"   

检查使用ffmpeg构建opencv。如果它是正确的,您的代码应该是好的。

如果不是,用ffmpeg重建opencv。osx下

代码语言:javascript
复制
brew install opencv --with-ffmpeg
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30096327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档