live555代码解读之三:SETUP和PLAY请求消息处理过程

来源:互联网 发布:无极树如何实现php 编辑:程序博客网 时间:2024/05/29 13:05
 

SETUP请求消息处理过程

        前面已经提到RTSPClientSession类,用于处理单独的客户会话。其类成员函数handleCmd_SETUP()处理客户端的SETUP请求。调用parseTransportHeader()对SETUP请求的传输头解析,调用子会话(这里具体实现类为OnDemandServerMediaSubsession)的getStreamParameters()函数获取流媒体发送传输参数。将这些参数组装成响应消息,返回给客户端。

       获取发送传输参数的过程:调用子会话(具体实现类MPEG1or2DemuxedServerMediaSubsession)的createNewStreamSource(...)创建MPEG1or2VideoStreamFramer,选择发送传输参数,并调用子会话的createNewRTPSink(...)创建MPEG1or2VideoRTPSink。同时将这些信息保存在StreamState类对象中,用于记录流的状态。

        客户端发送两个SETUP请求,分别用于建立音频和视频的RTP接收。 
 
PLAY请求消息处理过程

        RTSPClientSession类成员函数handleCmd_PLAY()处理客户端的播放请求。首先调用子会话的startStream(),内部调用MediaSink::startPlaying(...),然后是MultiFramedRTPSink::continuePlaying(),接着调用MultiFramedRTPSink::buildAndSendPacket(...)。buildAndSendPacke内部先设置RTP包头,内部再调用MultiFramedRTPSink::packFrame()填充编码帧数据。
 packFrame内部通过FramedSource::getNextFrame(),接着MPEGVideoStreamFramer::doGetNextFrame(),再接着经过MPEGVideoStreamFramer::continueReadProcessing(),FramedSource::afterGetting(...), MultiFramedRTPSink::afterGettingFrame(...), MultiFramedRTPSink::afterGettingFrame1(...)等一系列繁琐调用,最后到了MultiFramedRTPSink::sendPacketIfNecessary(),这里才真正发送RTP数据包。然后是计算下一个数据包发送时间,把MultiFramedRTPSink::sendNext(...)函数句柄传给任务调度器,作为一个延时事件调度。在主循环中,当MultiFramedRTPSink::sendNext()被调度时,又开始调用MultiFramedRTPSink::buildAndSendPacket(...)开始新的发送数据过程,这样客户端可以源源不断的收到服务器传来的RTP包了。
       

发送RTP数据包的间隔计算方法:
        Update the time at which the next packet should be sent, based on the duration of the frame that we just packed into it.

涉及到一些类有:

MPEGVideoStreamFramer: A filter that breaks up an MPEG video elementary stream into headers and frames
 
 MPEG1or2VideoStreamFramer:A filter that breaks up an MPEG 1 or 2 video elementary stream intoframes for: Video_Sequence_Header, GOP_Header, Picture_Header
 
 MPEG1or2DemuxedElementaryStream: A MPEG 1 or 2 Elementary Stream, demultiplexed from a Program Stream
 
 MPEG1or2Demux: Demultiplexer for a MPEG 1 or 2 Program Stream
 
 ByteStreamFileSource: A file source that is a plain byte stream (rather than frames)
 
 MPEGProgramStreamParser: Class for parsing MPEG program stream
 
 StreamParser: Abstract class for parsing a byte stream
 
 StreamState:A class that represents the state of an ongoing stream