如何实现低于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文件夹下脚本用法
- 推流示例:..\\CRMedia.exe -live "rtmp://localhost/live/demo" -vn "USB2.0 HD UVC WebCam" -an "麦克风 (Realtek High Definition Audio)" 其中rtmp地址输入自己搭建的流媒体服务器地址即可,-vn 后面填写CRDevices.exe检测的视频设备名称,-an 填写音频设备名称
- 拉流示例:..\\CRMedia.exe -play_stream "rtmp://localhost/live/demo" -nobuffer
推拉流画面截图如下:
说明:由于服务器为本机搭建测试地址,故延迟较低,公网环境会比此数据增大至大概200ms左右,大家可自行测试
任务管理器性能截图如下:
推流端内存占用会稍高,由于是单路视频的推拉流,性能占用较低
扩展
demo脚本还提供其他低延时扩展应用
- 拉流端工具理论支撑市场主流网络流:rtmp、rtsp、hls、http-flv等,这里需要说明的是如果加载hls类型缓冲流必须关闭-nobuffer选项 否则会一直触发丢帧策略
- 文件流播放:..\\CRMedia.exe -play_stream "D:\\BaiduYunDownload\\视频\\春天景色 4K.mp4",命令如上,文件流支持大部分视频格式,mp4、flv、mkv等,支持h265编码格式
- 相机应用:..\\CRMedia.exe -play_dev -vn "USB2.0 HD UVC WebCam" 如上可在推拉流基础上开发相机应用,对比win系统相机应用优势在于渲染延迟较低,画面无延迟感,有兴趣可以对比测试
- 流转发应用:..\\CRMedia.exe -turn_live "rtmp://192.168.1.21/live/demo" "rtmp://127.0.0.1/live/demo_test" -nobuffer 此功能为将一个流转发至另外一个流地址使用,服务器可做简易负载均衡应用,此工具优势在于流转发延时极低,基本可保障在100ms内延迟
以上是关于如何实现低于1ms的延迟?的主要内容,如果未能解决你的问题,请参考以下文章
如何实现并行,以这样的方式延迟,当输出低于阈值时并行化 for 循环停止?