一、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()
{
        VideoCapturecap;
        cap.open("rtsp://0.0.0.1/stream1");//呵呵,就这一句关键
        MatCamera_CImg;
        MatCamera_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是其中一个非常重要的知识节点。认真研究,一定能够有所收获。

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


【4OpenCV】OpenCV和RTSP的综合研究的更多相关文章

  1. (4opencv)OpenCV PR 成功的收获和感悟

     2018-09-12,第一次对OpenCV PR成功 https://github.com/opencv/opencv/pull/12206 <find innercircle of cont ...

  2. OpenCV获取RTSP解码播放

    #include <opencv2/opencv.hpp> int main(int argc, char **argv){ IplImage *pFrame = NULL, *srcIm ...

  3. OpenCV读取RTSP视频流

    用opencv的VideoCapture读取RTSP视频流,只有opencv3.1版本可以,之前的版本都无法读取视频流.可能的原因是云平台的RTSP视频流太差,经常错码.项目最后使用的是opencv2 ...

  4. 王爽-汇编语言-综合研究四-不使用main函数编程

    (一) 研究目的 使用C语言编程,我们一定要使用main函数么? (二) 研究过程 1) 最初的程序 首先,我们编写一个不写main函数的C语言程序. 程序如下: 在编译的过程中,没有发现错误.在链接 ...

  5. 王爽-汇编语言-综合研究一-搭建简易C环境

    (一) 学习过程: 整个过程分为两个部分: 第一:将TC2.0的环境使用虚拟软盘复制到DOS虚拟机中: 打开WinImage,fileànew,由于TC2.0的环境解压后为2.02M,所以我们在Sta ...

  6. 深入研究C语言 第一篇(续)

    没有读过第一篇的读者,可以点击这里,阅读深入研究C语言的第一篇. 问题一:如何打印变量的地址? 我们用取地址符&,可以取到变量的偏移地址,用DS可以取到变量的段地址. 1.全局变量: 我们看到 ...

  7. 研究实验1_搭建一个精简的C语言开发环境(包含部分经典的前言)

    综合研究:      在这部分内容中,将启示我们如何进行独立研究和深度思考(一定要注意这一点,相应的调整自己的学习思想).同时使我们:          (1)认识到汇编语言对于深入理解其他领域知识的 ...

  8. 研究不定数量参数的函数并实现一个printf函数

    一.前提知识 1.如何传递参数(主函数) a.函数的参数是通过栈传递,而且是从右到左依次入栈 b.即使是char型变量,在传递参数时,也是占用两个字节,因为push操作是两个字节为单位的. c.sho ...

  9. 用汇编语言研究C语言的全局变量、局部变量、参数、返回值放在哪里

    前提知识 c0s调用main函数的地址: 11ah main函数的连接地址: 01fah 一.全局变量与局部变量 测试程序 int a1,a2,a3; void f(void); void g(voi ...

随机推荐

  1. cocos2d JS-(JavaScript) 基础语法运算符

    简单且逼格高的运算符 var a = 12; console.log(-a); //输出 -12 - -> 取反 var b = a++; console.log(b); //输出 12 - - ...

  2. cocos2dx 3.x 网络循环接收数据(RakNet::Packet* packet)单步网络接收

    void FriendFightLayer::update(float dt) { dealWithPacket(dt); if (m_isNeedSwitchToLobby) { PublicMet ...

  3. Linux基础(四)网络设置

    环境: linux系统版本为:CentOS 7 虚拟机:vm12 共享本地计算机网络,达到我们linux系统上网的目的 虚拟机,添加网卡-设置 设置成,自定义vmnet8 NAT模式即可,不需要添加什 ...

  4. ES6class

    类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面.Object.assign方法可以很方便地一次向类添加多个方法. 类的内部所有定义的方法,都是不可枚举的 ...

  5. hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection

      hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection   这个问题一般是在hadoop2.x版本里会出 ...

  6. 删除(unfork)github中某个库(repository)

    1.头像->your profile 2.点击某个想要删除的库,出现界面: 3.点击setting,鼠标滚动页面至末尾,出现页面: 4.点击delete this repository: OK!

  7. javascript(一):javascript基本介绍及基本语法

    什么是javascript? javascript是一种直译型脚本语言,是一种动态类型.弱类型.基于原型的语言.(所谓“脚本语言”:指的是它不具有开发操作系统的能力,只是用来编写大型运用程序的脚本!) ...

  8. JQuery基本知识(3)

    JQuery基本知识(3) 一.JQuery拥有可操作HTML元素和属性的强大方法. 1.JQuery DOM操作(DOM文档对象模型) 获取内容的方法: text():设置或返回所选元素的文本内容 ...

  9. yii2验证密码->手机号码短信发送>手机短信发送频繁问题

    <?php namespace frontend\models; use Yii; use yii\base\Model; class ChangeMobileSendRequestForm e ...

  10. Block 循环引用(上)

    iOS的内存管理机制 Objective-C在iOS中不支持GC(垃圾回收)机制,而是采用的引用计数的方式管理内存. 引用计数:在引用计数中,每一个对象负责维护对象所有引用的计数值.当一个新的引用指向 ...