zoukankan      html  css  js  c++  java
  • OpenCV和RTSP的综合研究

    一、RTSP是什么?用来干什么?

    RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP请求由客户机发出,服务器作出响应;使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。RTSP是用来控制声音或影像的多媒体串流协议,并允许同时多个串流需求控制,传输时所用的网络通讯协定并不在其定义的范围内,服务器端可以自行选择使用TCP或UDP来传送串流内容,它的语法和运作跟HTTP 1.1类似,但并不特别强调时间同步,所以比较能容忍网络延迟。而前面提到的允许同时多个串流需求控制(Multicast),除了可以降低服务器端的网络用量,更进而支持多方视讯会议(Video Conference)。因为与HTTP1.1的运作方式相似,所以代理服务器〈Proxy〉的快取功能〈Cache〉也同样适用于RTSP,并因RTSP具有重新导向功能,可视实际负载情况来转换提供服务的服务器,以避免过大的负载集中于同一服务器而造成延迟。

    可以看出,RTSP作为一个应用层协议,主要是因为它的网络适应性、忍耐性,使得在电视电话会议,特别是在现在网络直播上面得到非常广泛应用。

    二、图像处理项目需要如何使用RTSP?

    对于图像处理程序来说,RTSP作为一种视频格式,主要是作为图像处理算法的输入输出而存在的。比如从网络上接入的(带系统的摄像机直接生成的)实时视频流,需要接入我们的系统;再比如算法的结果生产,如何附加到RTSP流上再传播出去。

    这个时候可能会遇到几个问题,首先是设置的问题。在基于DShow(非常巨大而且强大)的传统接入方式下,我们可以直接对摄像头的输入进行设置(基于filiter),而对于RTSP来说,可能是缺少统一的方法,而必须依据厂商自己的工具(因为它有一个操作系统在里面)。

    而对于如何附件到生成结果上来,又相当于编写RTSP服务,从而必须对它有比较深入的了解。

    三、OpenCV调用RTSP的几种方式。

    1、OpenCV自己基于FFMPEG集成了调用,这是最快的方式;

     

    #include "stdafx.h"
    #include <opencv2/opencv.hpp>
    #include <iostream>
    using namespace std;
    using namespace cv;
    int main()
    {
            VideoCapture cap;
            cap.open("rtsp://0.0.0.1/stream1");//呵呵,就这一句关键
            Mat Camera_CImg;
            Mat Camera_GImg;
            cap.set(CV_CAP_PROP_FRAME_HEIGHT,768);
            cap.set(CV_CAP_PROP_FRAME_WIDTH,1024);
            if (!cap.isOpened())
            return 1024;
            while (1)
            {
                      cap>> Camera_CImg;
                      if(Camera_CImg.empty())
                      break;
                      cvtColor(Camera_CImg,Camera_GImg, CV_RGB2GRAY);
                      imshow("input", Camera_CImg);
                      if (cvWaitKey(10) == 'q')
                      break;
            }
            system("pause");
    return 0;
    }

    关于那个"呵呵“一句,我估计实际使用的时候,可能还有一些新的问题。同时我也非常认为,这种默认的方法,总是不专业。

    2、基于DShow,构建FILTER(没有深入研究)

    开源的实现了RTSP协议的Directshow Filter比较少,一个开源的Filter:RTSP Renderer Filter,完成了一个小型RTSP 服务器的功能。

    https://blog.csdn.net/toshiba689/article/details/79410852

    3、仿制专门的RTSP播放程序

    这个地方,我有两个推荐。

    一个是 EasyPlayer-RTSP-Win forked from EasyDSS/EasyPlayer-RTSP-Win(https://github.com/jsxyhelu/EasyPlayer-RTSP-Win)

    An elegant, simple, fast windows RTSP Player.EasyPlayer support RTSP(RTP over TCP/UDP),video support H.264/H.265,audio support G.711/G.726/AAC!EasyPlayer RTSP是一款精炼、高效、稳定的RTSP流媒体播放器,视频支持H.264/H.265,音频支持G.711/G.726/AAC,支持RTP over UDP/TCP两种模式! http://www.easydarwin.org/

    应该说全部中文,vs程序,而且关键是非常对口。下一步我将基于它来进一步研究。

    一个是非常常见的VLC(https://github.com/videolan/vlc)

    但是这个比较复杂,集成起来比较困难。当作软件使用倒是不错。

    四、小结和扩展

    随着技术和需求的不断发展,对于视频的调用越来越迫切。RTSP是其中一个非常重要的知识节点。认真研究,一定能够有所收获。

    感谢阅读至此,希望有所收获。

  • 相关阅读:
    Hive on Spark
    Mongodb添加副本及修改优先级
    RabbitMQ与Spring集成
    最简单的图文教程,几步完成Git的公私钥配置
    Idea Ant 打开发包
    Spring Web 项目Junit测试报错问题
    阿里云maven仓库地址,速度提升100倍
    Spring boot 学习
    JAVA开发常用工具包
    从无到有搭建SSM框架
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/11031329.html
Copyright © 2011-2022 走看看