mpeg4网络传输 以及Livemedia 结构分析 .

  1. Live555类结构  
  2. live555几乎所有得处理单元都继承自Medium类;该类定义了基本接口,lookupByName,close和返回当前的环境类UsageEnvironment,nextTask,此外还有一些判断类型函数。属性又名字,环境指向下一个TaskToken的指针。  
  3.   
  4. MPEG4  
  5. ServerMediaSession对象的创建函数在文件DynamicRTSPServer.cpp中。DynamicRTSPServer的继承关系是DynamicRTSPServer:RTSPServer:Medium。当接受到带有URI请求以后,首先创建SMS,调用 ServerMediaSession的构造函数,除了创建时间戳,拷贝文件名外都是使用的缺省值,并且将初始化子会话链表。  
  6.   
  7. 当处理describe命令时,调用generateSDPDescription函数生成。  
  8.   
  9. 在NEW_SMS()中创建ServerMediaSession对象,然后创建MPEG4VideoFileServerMediaSubsession并将这个子会话对象添加到添加到会话对象中。  
  10. 创建MPEG4VideoFileServerMediaSubsession对象,对象的继承关系:  
  11. MPEG4VideoFileServerMediaSubsession::FileServerMediaSubsession  
  12. ::OnDemandServerMediaSubsession::ServerMediaSubsession ::Medium  
  13. ServerMediaSession::Medium  
  14. Medium:抽象了基本的接口,包括环境,task和媒体名和媒体查找函数以及一些辅助函数。  
  15.   
  16. Session  
  17. ServerMediaSession:添加了子会话链表,SDP描述以及一些媒体相关处理函数。  
  18. ServerMediaSubsession:定义了指向ServerMediaSession的父指针,指向下个一个对象的指针。该媒体的SDP信息,该媒体的读取定位函数等。  
  19. OnDemandServerMediaSubsession:添加了RTPSink处理函数以及经典命名属性等,这里缺省的端口号是6970?不知道什么意思。成员函数大部分和ServerMediaSubsession相似,在流媒体完成定位等处理。createNewStreamSource和createNewRTPSink是两个纯虚函数,在子类中必须实现。  
  20. FileServerMediaSubsession:增加了文件名和文件大小属性。MPEG4VideoFileServerMediaSubsession:添加了RTPSink属性,并且实现了OnDemandServerMediaSubsession中定义的两个纯虚函数,即创建了source和sink对象。这个source是MPEG4VideoStreamFramer。该类中还定义了StreamState的内部类。  
  21. StreamState:包含了指向OnDemandServerMediaSubsession的引用,RTPSink指针,BasicUDPSink指针,RTCPInstance指针FramedSource指针,fRTPgs和fRTCPgs(groupsock).StreamState类可以用OnDemandServerMediaSubsession的fLastStreamToken属性指向。  
  22.   
  23. Sink  
  24. 1. MPEG4ESVideoRTPSink::VideoRTPSink::MultiFramedRTPSink::RTPSink::MediaSink::Medium  
  25. MediaSink定义中有一个媒体源指针,主要处理函数有startplaying(),stopplaying()和 afterPlayingFunc函数指针。RTPSink类定义了RTP相关的处理和属性。包含Socket组对象,时间处理系列,统计计数处理等相关属性。  
  26. MultiFramedRTPSink是RTPSink的子类,处理buffer中的多个RTP包。VideoRTPSink仅仅添加了sdpMediaType处理函数,而MultiFramedRTPSink添加了辅助SDP处理和VOPIsPresent属性和一个判断性处理函数。  
  27.   
  28. 2. MPEG4ESVideoRTPSink中的处理函数doSpecialFrameHandling:首先检测开头的四个字节看是否是 VOP_START_CODE,该函数处理RTP的起始/中止标识和添加时间戳。其他处理包括是否允许分片,是否是起始包判断以及辅助SDP处理。父类 VideoRTPSink处理非常简单,仅仅是返回SDP类型是“video”。  
  29.   
  30. 3. MultiFramedRTPSink类:完成多帧组包处理主要函数有buildAndSendPacket, packFrame, sendNext, afterGettingFrame,这几个函数之间有相互调用。内部有OutPacketBuffer属性,在创建是设定为(1000(希望),1448(最大))大小,其他是统计或者标识属性。这个发送数据包是通过 fRTPInterface.sendPacket(fOutBuf->packet(), fOutBuf->curPacketSize());实现。这个fRTPInterface是父类RTPSink的属性。  
  31.   
  32. Source  
  33. createNewStreamSource调用的是MPEG4VideoFileServerMediaSubsession中的定义。在类 OnDemandServerMediaSubsession中的createNewStreamSource定义是一个纯虚函数。  
  34. 创建的source是:  
  35. MPEG4VideoStreamFramer:MPEGVideoStreamFramer:FramedFilter:FramedSource:MediaSource:Medium  
  36. MediaSource在Medium类的基础上添加了更多媒体类型判断,比如是H264,mpeg还是jpeg。此外还有一个MIME类型。  
  37. FramedSource类处理成帧类型的媒体,比如 mpeg,mjpeg,h264,amr等音频类型的媒体。改函数分帧处理媒体流,主要处理是getNextFrame,afterGetting以及关闭等媒体处理,此外定义了doGetNextFrame纯虚函数,这个函数由getNextFrame调用,处理具体的媒体流。该类还定义了两个函数指针,afterGettingFunc* fAfterGettingFunc; onCloseFunc* fOnCloseFunc;处理。  
  38. 该类的属性包括数据拷贝的指针,帧的大小,展示时间,和播放间隔。是否当前等待播放标志。子类FramedFilter是FramedSource的子类,这是个中间类,主要在类中添加了指向输入源的指针 FramedSource* fInputSource;  
  39. MPEGVideoStreamFramer:是FramedFilter的子类,因为mpeg是时间相关的媒体流,所以在父类的基础上添加了时间处理函数,此外还有 continueReadProcessing函数。主要的属性有:帧率,结束标志,图片计数,展示时间,GOP时间相关内容,图片时间相关属性。此外还有一个重要的类属性: MPEGVideoStreamParser用来分析媒体流。  
  40. MPEG4VideoStreamFramer:在父类的基础上添加了config信息,类如profile等级信息。在该类的定义文件中还实现了MPEG4文件分析类继承自MPEGVideoStreamParser。处理mepg4相关信息。  
  41.   
  42. ByteStreamFileSource::FramedFileSource::FramedSource  
  43. source里面有一个非常重要的StreamParser对象,用来分析,读取流数据。其中afterGettingBytes和不同媒体流处理相关,内部有一个函数fClientContinueFunc为不同媒体注册的函数。而getNextFrame会调用afterGettingBytes。  
  44.   
  45. RTPSoruce  
  46. MPEG4ESVideoRTPSource:MultiFramedRTPSource:RTPSource:FramedSource:MediaSource:Medium  
  47. RTPSource:添加RTP相关处理,主要属性有RTPInterface,时间标签,处理数据帧拆分packetMarkerbit时间戳频率和统计信息。  
  48. RTP统计信息:收到的总包数,从reset以后收到的总包数,收到的字节数,初始化序列标识,前面一个RTP包的时间戳,接受到的发送者报告的NTP时间,接受到的发送者报告时间。RTPSource仅仅处理RTP协议相关的问题。MultiFramedRTPsource中的 networkHandler中会调用到这些处理。  
  49.   
  50. playing  
  51. 在服务端的操作中是围绕着StreamState展开的,OnDemandServerMediaSubsession类中的StartStream通过调用StreamState的startplaying开始进行,并且初始化rtpSeqNum和rtpTimestamp (= rtpSink()->presetNextTimestamp()) 两个变量。在MediaSink定义了startPlaying,这里通过调用continuePlaying最终调用到了 buildAndSendPacket,函数buildAndSendPacket根据传入的参数是否第一帧分别进行处理。如果是第一帧,那么取当前时间标签,作为发送时间,在函数packFrame中,首先调用afterGettingFrame1,然后调用 fSource->getNextFrame(fOutBuf->curPtr(), fOutBuf->totalBytesAvailable(),afterGettingFrame, this, ourHandleClosure, this);处理。在播放过程中,通过nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecondsToGo,(TaskFunc*)sendNext, this);每次都会计算一个下次发送时间和包添加到调度中进行。  
  52.   
  53. 读取媒体数据在MPEG4VideoStreamParser类定义中处理。成员函数parse分析出读取数据的大小。然后读取一帧数据,交给打包代码处理。  
  54.   
  55.    
  56.   
  57. live555的rtsp媒体播放器,程序启动后,以端口号和系统环境为参数,创建一个RTSPServer对象,然后进入doEvendLoop循环,等待事件。  
  58.   
  59. RTSPServer  
  60.   
  61. DynamicRTSPServer从RTSPServer继承过来,仅仅添加了构造器和查找函数,没有添加其他成员。构造器是创建socket然后传给 RTSPServer,查找是如果没有已经打开的流服务,那么根据参数创建流服务。RTSPServer的属性有socket,端口号,Session点号,认证机制和ServerMediaSession表。  
  62.   
  63. 根据RTSP协议,当服务端收到Play命令时候,开始播放。调用得是subSession得streamStart方法。  
  64.   
  65. 现有的文件媒体会话  
  66.   
  67. MPEG4VideoFileServerMediaSubsession:FileServerMediaSubsession: OnDemandServerMediaSubsession: ServerMediaSubsession : Medium  
  68.   
  69. ServerMediaSubsession类和具体的流播放相关,是个纯虚类。其中startStream和getStreamParameter是纯虚函数。 OnDemandServerMediaSubsession是子类,在原来ServerMediaSubsession的基础上添加了RTP处理,添加流source和rtp-sink处理。封装seek,pause等处理,把这些接口中clientSessionid号到这里转换成了FramedSource。  
  70.   
  71. getStreamParameters方法会创建streamState。这个方法在处理RTP的Setup命令时被调用。  
  72.   
  73. onDemandServerMediaSubsession  
  74.   
  75.    
  76.   
  77.    
  78.   
  79. 类变量fDestinationsHashTable保存Destination对象,destination封装的时地址信息包括地址,端口,rtp信息。  
  80.   
  81. 类streamState的属性有:  
  82.   
  83.    
  84.   
  85. OnDemandServerMediaSubsession& fMaster; Boolean fAreCurrentlyPlaying;  
  86. unsigned fReferenceCount;                             Port fServerRTPPort, fServerRTCPPort;  
  87. RTPSink* fRTPSink;                                          BasicUDPSink* fUDPSink;  
  88. float fStreamDuration;                                        unsigned fTotalBW; RTCPInstance* fRTCPInstance;  
  89. FramedSource* fMediaSource;                        Groupsock* fRTPgs; Groupsock* fRTCPgs;  
  90.   
  91. sink有两种,一个时BasicUDPSink,一个是RTPSink,如果协商时没有RTP信息,那么创建BasicUDPSink。Source和 Sink通过函数createNewRTPSink和createNewStreamSource。这两个函数在类 OnDemandServerMeidaSubsession中定义为纯虚函数,如果媒体类型是mpeg4videofileserver,那么对应的函数定义在类MPEG4VideoFileServerMediaSubsession中。  
  92.   
  93. 播放过程  
  94.   
  95. 调用Sink的startPlaying,如果是RTPSink,那么创建RTCPInstance,添加RTCP处理函数rtcpRRHandler。 RTPSink->startPlaying(fMediaSource,afterPlayingStreamState,this)这里传入的三个三数分别是source,处理函数和StreamState对象。  
  96.   
  97. Sink  
  98.   
  99. Sink类提供了总的媒体播放接口,属性有:fSource指针,AfterPlayFunc函数指针和fAfterClientData。主要接口是startPLaying,continuePlaying纯虚函数,和前面的AfterPlayFunc  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值