我正在使用以下命令为html5流创建一个分段的html5:
-i rtsp://172.20.28.52:554/h264 -vcodec copy -an -f mp4 -reset_timestamps 1 -movflags empty_moov+default_base_moof+frag_keyframe -loglevel quiet -一切都很好,期待一个延迟问题,我正试图解决。如果每次从stdout输入数据时,都记录带有到达时间戳的数据,则得到以下输出:
16/06/2015 15:40:45.239 got数据大小= 24 16/06/2015 15:40:45.240 got数据大小= 7197 16/06/2015 15:40:45.241 got数据大小= 32768 16/06/2015 15:40:45.241 got数据大小= 4941 16/06/2015 15:40:45.241 got数据大小= 12606 16/06/2015 15:40:45.241 got数据大小= 6345 16/06/2015 15:40:45.241 got数据大小= 6339 16/06/2015 15:40:45.242 got数据大小= 6336 16/06/2015 15:40:45.242 got数据大小= 6361 16/06/2015 15:40:45.242 got数据大小= 6337 16/06/2015 15:40:45.242 got数据大小= 6331 16/06/2015 15:40:45.242 got数据大小= 6359 16/06/2015 15:40:45.243 got数据大小= 6346 16/06/2015 15:40:45.243 got数据大小= 6336 16/06/2015 15:40:45.243 got数据大小= 6338 16/06/2015 15:40:45.243 got数据大小= 6357 16/06/2015 15:40:45.243 got数据大小= 6357 16/06/2015 15:40:45.243 got数据大小= 6322 16/06/2015 15:40:45.243 got数据大小= 6359 16/06/2015 15:40:45.244 got数据大小= 6349 16/06/2015 15:40:45.244 got数据大小= 6353 16/06/2015 15:40:45.244 got数据大小= 6382 16/06/2015 15:40:45.244 got数据大小= 6403 16/06/2015 15:40:45.304 got数据大小= 6393 16/06/2015 15:40:45.371 got数据大小= 6372 16/06/2015 15:40:45.437 got数据大小= 6345 16/06/2015 15:40:45.504 got数据大小= 6352 16/06/2015 15:40:45.571获得数据大小= 6340 16/06/2015 15:40:45.637 got数据大小= 6331 16/06/2015 15:40:45.704 got数据大小= 6326 16/06/2015 15:40:45.771 got数据大小= 6360 16/06/2015 15:40:45.838 got数据大小= 6294 16/06/2015 15:40:45.904 got数据大小= 6328 16/06/2015 15:40:45.971 got数据大小= 6326 16/06/2015 15:40:46.038 got数据大小= 6326 16/06/2015 15:40:46.105获得数据大小= 6340 16/06/2015 15:40:46.171 got数据大小= 6341 16/06/2015 15:40:46.238 got数据大小= 6332
正如你所看到的,前23行(包含大约1.5秒的视频数据)几乎立即到达,然后每两条连续线之间的延迟为70 is,这是有意义的,因为视频是每秒15帧。这种行为会导致大约1.5秒的延迟。
这看起来像是一个冲水的问题,因为我不知道为什么ffmpeg需要在内存中保存前23帧,特别是因为每个帧都是它在mp4中自己的片段。但是,我找不到任何方法可以使ffmpeg更快地刷新这些数据。
有人有什么建议吗?
我想指出,这是这个问题的后续问题:Live streaming dash content using mp4box
发布于 2015-09-30 07:49:04
删除延迟的关键是使用-probesize参数:
正整数(输入) 设置探测大小(以字节为单位),即要分析的数据大小以获取流信息。更高的值将允许检测更多的信息,以防信息分散到流中,但会增加延迟。必须是不小于32的整数。默认情况下是5000000。
默认情况下,该值为5,000,000字节,相当于1.5秒的视频。通过将这个值减少到20万,我几乎完全消除了延迟。
发布于 2015-07-30 05:14:52
我通过使用-g选项来设置组中的帧数来解决延迟问题。在我的例子中,我使用了-g 2。我怀疑,如果不将其显式化,片段要么等待源提供密钥框架,要么在关闭片段并将其转储到stdout之前使用一个非常大的默认值来生成密钥框架。
发布于 2015-08-26 06:33:42
通常,在控制台输出的情况下,将禁用stdout的缓冲。如果从代码中运行ffmpeg,则会启用缓冲区,因此只有在缓冲区已满或命令结束时才能获得数据。
你必须消除你的操作系统的标准缓冲。在窗户上--这是不可能的有http://manpages.ubuntu.com/manpages/maverick/man1/stdbuf.1.html
https://stackoverflow.com/questions/30868854
复制相似问题