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
- live555代码解读之三:SETUP和PLAY请求消息处理过程
- live555代码解读之三:SETUP和PLAY请求消息处理过程
- live555代码解读之三:SETUP和PLAY请求消息处理过程
- live555代码解读之三:SETUP和PLAY请求消息处理过程
- live555代码解读之二:DESCRIBE请求消息处理过程
- live555代码解读之二:DESCRIBE请求消息处理过程
- live555代码解读之二:DESCRIBE请求消息处理过程
- live555代码解读之二:DESCRIBE请求消息处理过程
- live555学习之RTSP连接建立以及请求消息处理过程
- live555学习之RTSP连接建立以及请求消息处理过程
- live555学习之RTSP连接建立以及请求消息处理过程
- live555学习之RTSP连接建立以及请求消息处理过程
- live555学习二:数据流的发送(PLAY请求的处理)
- live555 SETUP处理详解
- live555代码解读
- live555代码解读之一:RTSP连接的建立过程
- live555代码解读之一:RTSP连接的建立过程
- live555代码解读之一:RTSP连接的建立过程
- live555代码解读之二:DESCRIBE请求消息处理过程
- ASP.NET自定义错误页面
- 求助!!vc++不能加载FileTool.dll
- SecureCRT
- 跟我一起写udev规则(译)
- live555代码解读之三:SETUP和PLAY请求消息处理过程
- 开关电源的组成原理
- linux gcc用法及参数说明
- 配置fckeditor 实现图片的上传
- SQL建立一个聚集索引与非聚集索引
- Photoshop 学习笔记:1、渐变GIF图片的设计
- PHP中使用strip_tags() 去除html标签
- 在Livemedia的基础上开发自己的流媒体客户端 V 0.01
- 【转帖】Materialized view terminology(物化视图)