• live555简介


    live555官网http://www.live555.com/

     一、Live555不但提供rtsp客户端,而且提供比较完善的rtsp服务端:

          客户端:live555客户端使用的是RTSPClient类,其中包含发送DESCRIBE消息describeURL、describeWithPassword,发送SETUP消息的setupMediaSubsession,发送心跳消息的sendOptionsCmd,发送PLAY消息的playMediaSession,发送TEARDOWN消息的teardownMediaSession等,如果想添加一些其他的功能可以直接修改相应的函数就可以了,在客户端中所有的函数都是同步的,也就是说在运行时线程是堵死的。

          服务端:live555服务端主要使用了两个个控制类,分别是RTSPServer、OnDemandServerMediaSubsession,如果想实现rtsp服务端就只需要继承这两个类就可以了,RTSPServer为全局唯一的服务类,服务端使用TaskScheduler类的doEventLoop作为消息轮询,当收到客户端消息时传给RTSPServer进行相应,RTSPServer根据客户端标识来查找对应的OnDemandServerMediaSubsession类来实现音频、视频包的分发,每一个rtsp连接对应一个OnDemandServerMediaSubsession对象,在OnDemandServerMediaSubsession中可以实现rtsp各消息的相应,包括:DESCRIBE、SETUP、PLAY、TEARDOWN,如果你想做其他的相应,也可以在继承类中重写或添加相应函数。

    二、简述一下live555的主要目录结构:

    1、mediaServer
        其中有个小程序,名叫live555MediaServer。这是个使用live555库写出的一个流媒体服务器,功能就是将本地的视频文件变成媒体流。
     
    2、testProgs
        里面有许多测试程序,这里提到一个叫做openRTSP的程序,这是live555做的一个比较完整的接收rtsp流的工程。运行./openRTSP rtsp://IP:PORT/FILENAME之后
    就会在当前目录下看到一个以video-MPV-开头的文件,这就是openRTSP接受到流后然后保存在本地的文件。虽然这个openRTSP已经做的比较稳定,功能也很完整,但是
    如果要用live555开发自己的RTSP应用程序,不建议基于这个程序,因为这个程序太复杂了,而比较建议基于一个叫做testRTSPClient的小而简单的测试程序。
     
    3、UsageEnvironment
         该模块是对系统环境的抽象,包括抽象类UsageEnvironment和TaskScheduler。
         UsageEnvironment主要用于消息的输入输出和用户交互功能。
         TaskScheduler实现事件的异步处理、事件处理函数的注册等,它通过维护一个异步读取源实现对诸如通信消息到达等事件的处理,通过使用DelayQueue实现对其他注册函数
    的延时调度。
         该模块还包含一个HashTable类,在整个项目中都可以用到它。程序设计者通过自定义该抽象了类UsageEnvironment和TaskScheduler类的子类,就可以在特定环境(如GUI
    环境)中运行,不需要进行过多的修改。
     
    4、BasicUsageEnvironment
        该模块是UsageEnvironment的一个控制台应用的实现。它针对控制台的输入输出和信号响应进行具体实现。
     
    5、GroupSock
        该模块用于实现数据包的发送和接收。GroupSock主要被设计用以支持多播,但它也完全支持单播通信。
     
    6、LiveMedia
        是Live555最重要的模块。该模块声明了一个抽象类Medium,其他所有类都派生自该类,下面简要介绍这些类:
        RTSPClient:该类实现RTSP请求的发送和响应的解析,同时根据解析的结果创建对应的RTP会话。
        MediaSession:用于表示一个RTP会话,一个MediaSession可能包含多个子会话(MediaSubSession),子会话可以是音频子会话、视频子会话等。
        RTCPInstance:该类实现RTCP协议的通信。
        Source和Sink:这两个概念类似DirectShow中的Filter。Source抽象了数据源,比如通过RTP读取数据。Sink是数据消费者的抽象,比如把接收到数据存储到文件,该文件就是一个Sink。数据的流动可能经过多个Source和Sink。MediaSink是各种类型的Sink的基类,MediaSource是各种类型Source的基类,各种类型的流媒体格式和编码的支持即是通过对这两个类的派生实现的。Source和Sink通过RTP子会话(MediaSubSession)联系在一起。
     
    三、openRTSP客户端流程
         
        1、创建TaskScheduler和BasicUsageEnvironment类;
        2、命令行解析,获取流媒体地址和其他选项;
        3、创建RTSPClient对象;
        4、如果需要,RTSPClient对象发送OPTIONS命令并解析服务端响应,获取可以使用命令集。
        5、RTSPClient对象发送DESCRIBE命令,并从获服务端反馈中获取流媒体相关描述SDP字串。
        6、创建MediaSession对象,解析SDP字串,创建了相应的子会话对象。在这个过程中还完成了RTP和RTCP通信使用的GroupSock对象的创建,包括协议和端口的选择。
        7、根据流媒体不同类型,实例化具体的RTP会话的Source和Sink对象。
        8、RTSPClient对象发送SETUP和PLAY命令,服务端开始传输流媒体数据。
        9、TaskScheduler开始事件处理循环,通过select监听数据包到达并调用注册函数进行处理。
  • 相关阅读:
    CentOS7搭建FastDFS V5.11分布式文件系统(二)
    CentOS7搭建FastDFS V5.11分布式文件系统(一)
    JRebel最新破解激活版(IDEA自动部署插件)
    idea常用插件
    idea安装完成后要做的几件事(设置字体、编码、行号)
    IDEA修改Maven全局配置
    IDEA打开光标是粗黑色,backspace键、insert键点击无效的解决办法
    Hadoop build error java.lang.NoClassDefFoundError: org/sonatype/aether/graph/DependencyFilter
    Golang项目目录结构组织
    再看GOPATH
  • 原文地址:https://www.cnblogs.com/wyqfighting/p/2872579.html
Copyright © 2020-2023  润新知