live555源码分析——RTSP服务端发送数据流程

时间:2024-03-24 15:43:14

一直有个疑惑,发送rtp数据的时间间隔在哪里控制的,onDemandServer 从文件中读取h264,aac等,也没有看到sleep,wait等等。但是播放依然是匀速的。【live555使用单线程任务驱动的方式,scheduleDelayedTask(int64_t microseconds,...) 这个就可以添加一个延迟指定时间执行的任务】
拿aac ADTSAudioFileSource.cpp来分析,这里面的 doGetNextFrame()中有一个操作,  fDurationInMicroseconds = fuSecsPerFrame;
一张流程图解释:基于ontestDemandServer 播放test.aac来分析(分析播放h264流程的话,大体原理是一样的,但是从FramedSource中取数据出来部分,经过了好些个FrameFilter, 其目的只是分析h264的pps,sps,和分解NAL,最终给出一帧一帧的NAL。所以整个还是相当于一个FramedSource的作用。 而aac-ADTS文件的读取,就好分析得多了。)
以下图:粉色表示开始,紫色表示整个流的play结束调用。橙色部分是RTPSink, 绿色部分表示FramedSource.两个模块之间的蓝色箭头,就构成循环读取帧并打包发送的循环体。速度间隔控制,在于MultFramedRTPSink类里面的sendPacketIfNecessary(),发完当前帧,添加一个延时uSecondsToGo的任务,来驱动发送下一帧。

live555源码分析——RTSP服务端发送数据流程