在RTSP服务器中需要一个定时器来定时发送音频帧和视频帧。音频帧每隔23ms发送一帧,视频帧每隔40ms发一帧。
因此需要两个定时器来定时发送,此时我们就需要用到一个TimerManager来管理Timer。
在TimerManager类中我们需要创建定时器文件描述符,这个文件描述符会在定时器到期时触发一个可读事件。
然后将该文件描述符添加到epoll实例中监听EPOLLIN事件。
设置定时器到期时间,当一个新的定时器被添加的时候,调用timerfd_settime设置定时器文件描述符的到期时间。
在epoll_wait()中等待,检测到文件描述符有可读事件,说明定时器已到期。
处理定时器事件,调用的是TimerManager中的handleread函数,在该函数中找到到期的定时器执行该定时器的handleEvent函数。
在handlerEvent函数中执行的是TimerEvent中中handleEvent。真正注册回调函数的是在Sink类中,在Sink类中添加了cbTimeout回调函数。在Sink类中创建了定时器添加到了TimerManager中,至此形成了闭环。
整体流程如下:
在main函数中创建了h264filesink和aacfilesink,在这两个类中创建了两个TimerEvent,同时在TimerEvent中注册了回调函数以及定时时间。
然后向之前已经创建好的TimerManager中添加这两个TimerEvent。而在之前创建创建好的TimerManager中已经创建了文件描述符和注册了回调函数并修改了定时时间,然后添加进了epoll实例中进行监听。定时器到期后执行TimerEvent中的handleEvent,也就是Sink类中的cbTimeout函数。