live555本身是一个单进程、单线程的服务器,但是它能够完美的让多个客户端同时连接,除了使用select并发编程以外,延时队列是很重要的手段。

当连接一个客户端,进行视频帧传输的时候,是不能持续进行传输的,因为如果持续传输的话会占满整个线程,这样的话新的客户端便无法进行连接了,所以当传送一帧视频流的最后并不会马上再传送下一帧,而是调用scheduleDelayedTask()函数将传送下一帧的工作加入到延时队列里。这个步骤在函数sendPacketIfNecessary()中进行。下面是scheduleDelayedTask()函数的代码:

TaskToken BasicTaskScheduler0::scheduleDelayedTask(int64_t microseconds,TaskFunc* proc,void* clientData) {if (microseconds < 0) microseconds = 0;DelayInterval timeToDelay((long)(microseconds/1000000), (long)(microseconds%1000000));AlarmHandler* alarmHandler = new AlarmHandler(proc, clientData, timeToDelay);fDelayQueue.addEntry(alarmHandler);return (void*)(alarmHandler->token());
}

加入到延时队列之后,需要时刻主动去延时队列查询有没有超时的任务,这个调用操作在SingleStep()函数中完成,SingleStep()最后有如下代码:

  // Also handle any delayed event that may have come due.fDelayQueue.handleAlarm();

就是在这个调用更新延时队列,然后查询有没有超时的任务进行执行。主要调用的函数有removeEntry()(删除延时队列中的节点),synchronize()(同步队列中节点的剩余时间),handleTimeout()(执行超时节点的任务)。

转载于:https://www.cnblogs.com/dchipnau/p/5479126.html

3.live555源码分析----延时队列相关推荐

  1. live555 源码分析:播放启动

    本文分析 live555 中,流媒体播放启动,数据开始通过 RTP/RTCP 传输的过程. 如我们在 live555 源码分析:子会话 SETUP 中看到的,一个流媒体子会话的播放启动,由 Strea ...

  2. live555 源码分析:子会话 SDP 行生成

    如我们在前文 live555 源码分析:ServerMediaSession 中看到的,H264VideoFileServerMediaSubsession 的继承层次体系如下图: 在这个继承层次体系 ...

  3. live555 源码分析:ServerMediaSession

    在 live555 中,用一个 ServerMediaSession 表示流媒体会话,它连接了 RTSPServer 和下层流媒体传输逻辑.ServerMediaSession 和 ServerMed ...

  4. live555 源码分析:RTSPServer 组件结构

    前面几篇文章分析了 live555 中 RTSP 的处理逻辑,RTSP 处理有关组件的处理逻辑有点复杂,本文就再来梳理一下它们之间的关系. live555 中 RTSP 处理有关组件关系如下图: 事件 ...

  5. live555 源码分析: PLAY 的处理

    在 SETUP 请求之后,客户端会发起 PLAY 请求,以请求服务器开始传输音视频数据.在 PLAY 请求执行时,一定是已经执行过 SETUP 请求,建立好了客户端会话,因而会与其它要求客户端会话已经 ...

  6. live555 源码分析: SETUP 的处理

    SETUP 请求在 RTSP 的整个工作流程中,用于建立流媒体会话.本文分析 live555 对 SETUP 请求的处理. 在 RTSPServer::RTSPClientConnection::ha ...

  7. live555 源码分析: DESCRIBE 的处理

    前面在 live555 源码分析:RTSPServer 中分析了 live555 中处理 RTSP 请求的大体流程,并分析了处理起来没有那么复杂的一些方法,如 OPTIONS,GET_PARAMETE ...

  8. live555 源码分析:MediaSever

    位于 live555 项目 mediaServer 目录下的是 "LIVE555 Media Server",它是一个完整的 RTSP 服务器应用程序.它可以把多种媒体文件转为流, ...

  9. live555 源码分析:基础设施

    live555 由多个模块组成,其中 UsageEnvironment . BasicUsageEnvironment 和 groupsock 分别提供了事件循环,输入输出,基本的数据结构,以及网络 ...

最新文章

  1. 实时双频Wi-Fi如何实现下一代车内连接
  2. 前端常用插件、工具类库汇总(上)
  3. numpy.random.randint详解
  4. 近世代数--置换群--置换permutation分解成什么?置换的级如何计算?
  5. Exception Handling Best Practices in .NET
  6. Advanced search view打开出错的问题
  7. python爬虫和医学数据_医学论文中的数据有什么软件可以对之进行收集和处理吗?爬虫?...
  8. 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件
  9. DIV+CSS图片和文字如何显示同一行
  10. Windows PE/COFF
  11. 用Typora+PicGo搞定多个平台发文和微信公众号排版
  12. 计算机网络通信中的交换方式有哪几种,数据通信方式有哪几种
  13. CISP注册信息安全工程师证书及展示
  14. fx5u 脉冲输出指令PLSY(DPLSY)4种写法
  15. 降噪耳机哪个牌子好?商务用蓝牙降噪耳机推荐
  16. CU4C字符集检测和转换,C++版本
  17. java发展趋势看法_我对前端技术更新的看法以及未来发展趋势预测
  18. Docker在Centos7安装、及命令(详细安装教程)
  19. 参加 10/11 微软技术创新日 学到的关键字
  20. 超实数(Hyper-reals)是什么人发明的?

热门文章

  1. C语言指针变量--图示易懂
  2. Python中的相对文件路径的调用
  3. SeDuMi教程(1)
  4. 学计算机必须学会模拟电路,2016年广西大学计算机与电子信息学院1304电路分析基础与模拟电子线路之电路分析基础复试笔试仿真模拟题...
  5. python中将列表中的元素倒序输出_python实现对列表中的元素进行倒序打印
  6. 计算机机房的安全等级分,计算机机房安全等级的划分标准是什么
  7. 万分之二用百分之怎么表示_红木家具怎么辨别真假
  8. 如何用ARKit将太阳系装进iPhone(二)
  9. Java基础---封装继承静态
  10. 前端-面试题(答案仅限于自己的理解,非正确答案)