实时视频流滞后
Real time video stream lag
我的应用程序使用实时视频流向用户实时显示一些演示文稿 (!)。我在我的电脑上安装了一个网络摄像头和视频编码器,还有一个提供视频服务的服务器 (ustream)。
服务视频和真实视频之间有近 30 秒的延迟时间。
这个问题对于我的情况来说是微不足道的问题。但在我的情况下,所有用户必须同时看到相同的屏幕。 (无滞后)就像一个实时视频游戏!
第一个问题是为什么用户之间会有延迟(将近4秒!)?
第二个问题我怎样才能让这个滞后时间为零或低滞后?
编辑:
流媒体提供商是 ustream.com,h264 编码 360p 750fps
让我回答你的两个问题:
"why is there a lag(nearly 4 seconds!) between users ?"
这主要是因为播放器中的用户之间没有时间同步,这不是一件容易的事。
首先让我们考虑当用户在 UTC 的某个时间开始播放视频时会发生什么:
- 用户从服务器获取流信息(这可能是 RTMP 连接或 m3u8/dash 清单)
- 然后用户开始接收视频块,每个块都从 keyframe 开始 - 这是其他帧引用的完整图片。块只能从关键帧开始播放。
- 视频块完成后,从相应的关键帧播放另一个视频块。
这或多或少会发生,无论是哪种流式传输。
所以现在当一些其他用户在几秒钟后启动相同的流时 - 他们将打开相同的块(因为那是 "newest")并从相同的关键帧开始,但这次它已经是一些秒旧。
您观察到的 4 秒意味着 ustream 块可能正是那个长度。
"how can i get this lag time to zero or low-lag ?"
我必须声明,我从未尝试过在多个用户之间同步视频,但我曾与同事争论过一次,这是可能的,我会采用以下方法:
- 首先你需要同步用户之间的时间(了解他们的计算机时钟和一些绝对时间之间的偏差,here's a good question on this
- 播放器会告诉你当前的视频时间是多少,你需要计算出与服务器时间的偏差。
- 播放时间和服务器时间之间的时间偏差是您应该暂停视频的时间。
然后,如果一切顺利,您的所有用户将在完全相同的时间(或至少低于单帧持续时间的 40 毫秒)看到视频。
如前所述,发生的事情和用户看到的事情之间的延迟收集自:
- 传感器延迟。也许微秒
- 编码器延迟。通常我们可以说不到100毫秒
- 编码器软件延迟。如果这块没断,不到100ms
- 编码器到服务器的网络延迟。这里它可能偏离 30 毫秒到 1000 毫秒。如果有平衡器,再加500ms
- 内部服务器延迟。这里它可能是从 10 毫秒到 500 毫秒。例如,如果服务器不信任编码器并解包和重新排序帧,则最多 200-500 毫秒
- 流媒体协议延迟。如果是rtmp,它可能几乎是0毫秒,使用HLS它会达到30 000毫秒。
- 服务器-客户端网络延迟。 UDP 提供更小的延迟(当然这里有很多问题要讨论),TCP 提供更大的延迟。
- 客户端软件延迟
- 客户端解码器延迟
- 客户端视频子系统延迟。如果您还不知道,但是当您在现代 PC 上按下按键时,往返海洋和返回所需的时间比在显示器上绘制一个新字母所花费的时间更少。
因此,我希望您看到需要优化多少东西才能使延迟小于 1000 毫秒。
我们已经实现了 WebRTC 服务器,并实现了从 IP 摄像机到服务器以及从服务器到浏览器的大约 300 毫秒延迟。所以普通的普通浏览器在 300 毫秒后获取视频。视频从莫斯科传输到阿姆斯特丹并返回。
WebRTC 确实是满足您这种需求的好方法。
我的应用程序使用实时视频流向用户实时显示一些演示文稿 (!)。我在我的电脑上安装了一个网络摄像头和视频编码器,还有一个提供视频服务的服务器 (ustream)。
服务视频和真实视频之间有近 30 秒的延迟时间。
这个问题对于我的情况来说是微不足道的问题。但在我的情况下,所有用户必须同时看到相同的屏幕。 (无滞后)就像一个实时视频游戏!
第一个问题是为什么用户之间会有延迟(将近4秒!)? 第二个问题我怎样才能让这个滞后时间为零或低滞后?
编辑:
流媒体提供商是 ustream.com,h264 编码 360p 750fps
让我回答你的两个问题:
"why is there a lag(nearly 4 seconds!) between users ?"
这主要是因为播放器中的用户之间没有时间同步,这不是一件容易的事。
首先让我们考虑当用户在 UTC 的某个时间开始播放视频时会发生什么:
- 用户从服务器获取流信息(这可能是 RTMP 连接或 m3u8/dash 清单)
- 然后用户开始接收视频块,每个块都从 keyframe 开始 - 这是其他帧引用的完整图片。块只能从关键帧开始播放。
- 视频块完成后,从相应的关键帧播放另一个视频块。
这或多或少会发生,无论是哪种流式传输。
所以现在当一些其他用户在几秒钟后启动相同的流时 - 他们将打开相同的块(因为那是 "newest")并从相同的关键帧开始,但这次它已经是一些秒旧。
您观察到的 4 秒意味着 ustream 块可能正是那个长度。
"how can i get this lag time to zero or low-lag ?"
我必须声明,我从未尝试过在多个用户之间同步视频,但我曾与同事争论过一次,这是可能的,我会采用以下方法:
- 首先你需要同步用户之间的时间(了解他们的计算机时钟和一些绝对时间之间的偏差,here's a good question on this
- 播放器会告诉你当前的视频时间是多少,你需要计算出与服务器时间的偏差。
- 播放时间和服务器时间之间的时间偏差是您应该暂停视频的时间。
然后,如果一切顺利,您的所有用户将在完全相同的时间(或至少低于单帧持续时间的 40 毫秒)看到视频。
如前所述,发生的事情和用户看到的事情之间的延迟收集自:
- 传感器延迟。也许微秒
- 编码器延迟。通常我们可以说不到100毫秒
- 编码器软件延迟。如果这块没断,不到100ms
- 编码器到服务器的网络延迟。这里它可能偏离 30 毫秒到 1000 毫秒。如果有平衡器,再加500ms
- 内部服务器延迟。这里它可能是从 10 毫秒到 500 毫秒。例如,如果服务器不信任编码器并解包和重新排序帧,则最多 200-500 毫秒
- 流媒体协议延迟。如果是rtmp,它可能几乎是0毫秒,使用HLS它会达到30 000毫秒。
- 服务器-客户端网络延迟。 UDP 提供更小的延迟(当然这里有很多问题要讨论),TCP 提供更大的延迟。
- 客户端软件延迟
- 客户端解码器延迟
- 客户端视频子系统延迟。如果您还不知道,但是当您在现代 PC 上按下按键时,往返海洋和返回所需的时间比在显示器上绘制一个新字母所花费的时间更少。
因此,我希望您看到需要优化多少东西才能使延迟小于 1000 毫秒。
我们已经实现了 WebRTC 服务器,并实现了从 IP 摄像机到服务器以及从服务器到浏览器的大约 300 毫秒延迟。所以普通的普通浏览器在 300 毫秒后获取视频。视频从莫斯科传输到阿姆斯特丹并返回。
WebRTC 确实是满足您这种需求的好方法。