如何实现低于1ms的延迟?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现低于1ms的延迟?相关的知识,希望对你有一定的参考价值。

我想实现一个延迟,但Sleep()最低只能实现1毫秒吧,如何实现低于1毫秒的延迟呢?

Windows下面实现起来比较困难一些。呵呵。至少我不会。
记得学boost.date_time的时候,文档有说Windows下面好像 不能提供纳秒级别的定时还是怎么的。

缺省情况下,posix_time 系统内部使用一个64位整数来提供微秒级的解析度。作为另一个选择,使用一个64位整数加一个32位整数(共96位精度),可以提供纳秒级的解析度。缺省实现可以提供更好的性能和最小的内存占用,多数应用程序并不需要纳秒级的解析度。

要使用更高的解析度(96位纳秒级别),必须在库用户的工程文件(如 Makefile, Jamfile, 等等)中定义变量 BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG. 该宏并不被格里历系统使用,因此在构建本库时没有作用。

和版本1.33一样,date_time 库引入了一个新的IO流系统。有些编译器不能使用这个新系统。对于这些编译器,早期的("遗留")IO系统仍然可用。不被支持的编译器将自动选择遗留系统,但用户也可以通过定义 USE_DATE_TIME_PRE_1_33_FACET_IO 来强制使用遗留系统。

为方便使用,date_time 提供了一些 额外的时间长度类型。使用这些类型可能会由于“保持为月末”的行为而导致意外结果(完整细节和例子请见 操作可逆性的缺陷)。缺省情况下,这些类型都是可用的。要禁止这些类型,只需在你的工程文件中去定义 BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES 即可。

另一个方便的用法是 date 和 ptime 的缺省构造函数。缺省情况下这些构造函数是可用的。要禁止它们,只需在你的工程文件中定义 DATE_TIME_NO_DEFAULT_CONSTRUCTOR 即可。
参考技术A 如其这么求人,为什么你不GOOGLE下, 关键字:C函数sleep,我想一定能找到你想要的答案。

rtmp直播如何实现200ms内级别延迟?

实测

接上文,今天分享下基于上一篇博客开发的PC端直播SDK及相关衍生工具。方便直播开发者最对比测试

下载地址

csdn:测试工具

暂提交csdn链接,已固定免费积分下载

测试说明

sdk文件结构如上,仅支持win平台运行,使用之前请确保已安装vc2015运行环境,如果没有安装请双击vcredist2015.exe环境包

  • CRDevices.exe 为pc端摄像头和麦克风设备列表读取工具

双击运行结果如上图,可读取音频麦克风设备名称和摄像头名称,摄像头可读取id(部分采集卡名称可能相同,需要通过id区分)采集格式、分辨率、帧率等信息

  • CRMedia.exe为推拉流主程序,具体用法可见demo文件夹下脚本用法
    1. 推流示例:..\\CRMedia.exe -live "rtmp://localhost/live/demo" -vn "USB2.0 HD UVC WebCam" -an "麦克风 (Realtek High Definition Audio)"  其中rtmp地址输入自己搭建的流媒体服务器地址即可,-vn 后面填写CRDevices.exe检测的视频设备名称,-an 填写音频设备名称
    2. 拉流示例:..\\CRMedia.exe -play_stream "rtmp://localhost/live/demo" -nobuffer

推拉流画面截图如下:

说明:由于服务器为本机搭建测试地址,故延迟较低,公网环境会比此数据增大至大概200ms左右,大家可自行测试

任务管理器性能截图如下:

推流端内存占用会稍高,由于是单路视频的推拉流,性能占用较低

扩展

demo脚本还提供其他低延时扩展应用

  1. 拉流端工具理论支撑市场主流网络流:rtmp、rtsp、hls、http-flv等,这里需要说明的是如果加载hls类型缓冲流必须关闭-nobuffer选项 否则会一直触发丢帧策略
  2. 文件流播放:..\\CRMedia.exe -play_stream "D:\\BaiduYunDownload\\视频\\春天景色 4K.mp4",命令如上,文件流支持大部分视频格式,mp4、flv、mkv等,支持h265编码格式
  3. 相机应用:..\\CRMedia.exe -play_dev -vn "USB2.0 HD UVC WebCam" 如上可在推拉流基础上开发相机应用,对比win系统相机应用优势在于渲染延迟较低,画面无延迟感,有兴趣可以对比测试
  4. 流转发应用:..\\CRMedia.exe -turn_live "rtmp://192.168.1.21/live/demo" "rtmp://127.0.0.1/live/demo_test" -nobuffer 此功能为将一个流转发至另外一个流地址使用,服务器可做简易负载均衡应用,此工具优势在于流转发延时极低,基本可保障在100ms内延迟

以上是关于如何实现低于1ms的延迟?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现并行,以这样的方式延迟,当输出低于阈值时并行化 for 循环停止?

如何降低 Azure 表存储延迟

如何使用 WASAPI 共享模式获得低于 10 毫秒的延迟?

在Java中如何实现较为精确的定时器

shell脚本如何实现毫秒级别的计时

双活数据中心构建方法及实现技术