一、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. GO language for windows

    我记得我们已经下载完成了windows 下Go 的安装包 go1.9.windows-amd64.msi下面接着说吧 GO 在Windows 上也是按照linux 惯例来编程的,所以,你还需要一个wi ...

  2. 关于随机数、方法重载和System.out.println()的认识

    (1)使用纯随机数发生器编写一个指定数目内数字的程序(类真随机数) 源代码: package Demo1; public class trueRandom { long Multiplier = 45 ...

  3. Thinkphp 3.2 验证码图片显示错误解决方法

    在调用验证码之前加上 ob_clean(); 不显示验证码的代码: public function verify(){ $verify = new \Think\Verify(); $verify-& ...

  4. C#什么时候需要使用构造函数

    只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就需要调用默认构造函数.除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例 ...

  5. [ Windows BAT Script ] BAT 脚本获取windows权限

    BAT 脚本获取windows权限 @echo off echo I am trying to run as Administrator %1 %2 ver|find "5."&g ...

  6. cache基础

    cache是系统中的一块快速SRAM,价格高,但是访问速度快,可以减少CPU到main memory的latency. cache中的术语有: 1) Cache hits,表示可以在cache中,查找 ...

  7. tcl脚本

    tcl,全名tool command language,是一种通用的工具语言. 1)每个命令之间,通过换行符或者分号隔开: 2)tcl的每个命令包含一个或者多个单词,默认第一个单词表示命令,第二个单词 ...

  8. DX9 DirectX键盘控制程序 代码

    // @time: 2012.3.26 // @author: jadeshu // des: DirectX键盘控制程序 #include <Windows.h> #include &l ...

  9. C# 实现生产者消费者队列

    开发过程中经常会碰到这样的场景:需要从一个地方获取一些数据,然后处理数据并将其保存在数据库中. 1 2 3 4 5 6 7 8 9 10 private void FetchData() {} pri ...

  10. 键值对Dictionary、KeyValuePair、Hashtable 简单使用。

    KeyValuePair是单个的键值对对象.KeyValuePair可用于接收combox选定的值. 例如:KeyValuePair<string, object> par = (KeyV ...