如何找出何时提高比特率? (TCP流媒体解决方案)

时间:2011-01-13 18:53:43

标签: c++ tcp real-time delay

我们有一个正在生成数据的应用程序。例如,从相机捕获实时视频并对其进行编码。我们需要知道一个编码帧的大小,以便通过网络发送并立即接收。所以说“通过TCP实时视频流”。它的主要问题是什么 - 用户个人流量负载和服务器整体负载。我们的帧必须具有这样的大小(这里的大小==比特率),服务器将以最小的延迟接收。在我的情况下必须使用TCP(我们必须发送所有捕获的帧,即使它们的质量会下降)

我们有一个带有“框架”的流。每个“帧”都有一个“时间戳”。帧具有比特率属性,实际上是它们的大小。我们使用我们的应用程序生成框架,并将它们逐个流式传输到我们的TCP服务器套接字上。同时服务器发布回复,所以当在每个发送的帧之后我们尝试从套接字读取时,我们接收当前在服务器上的哪个时间戳。如果时间戳低于前一帧,我们将比特率降低20%。这样的方案似乎可以给我一个方法vbr(降低),但我想知道如何实现增加?我的意思是我们总是可以尝试每帧增加5%,直到一些有限的期望值,但每次我们有延迟将失去我们的流的实时功能...通常这样的方案是为了找出有多少网络流是目前由其他用户应用程序使用,并提供同时加载多少服务器的图片,以便我们可以为所有人实时传输适当数量的数据。那么我该怎样做才能增加我的计划?因此,当前比特率A,我认为我们可以增加+ 7%的3帧,然后一个-20%然后如果所有3帧+ 7%及时,我们可以添加14%的A和重复循环和如果第二帧会延迟来到我们身边,那么希望不会真正引人注意......

3 个答案:

答案 0 :(得分:3)

网络状况太不稳定,因此您需要不断适应它们。测量往返延迟:让服务器使用数据包ID而不是时间戳发送回确认。这样你就可以避免与服务器的任何时间同步(复杂的任务)。比较分组接收时间和分组发送时间以接收往返延迟值。分析往返延迟:如果它低于某个阈值(例如500ms) - 如果往返延迟大于某个另一个阈值(例如1s),则可以稍微提高比特率 - 降低比特率。这样的阈值范围用于避免无限比特率修改

答案 1 :(得分:1)

如果您可以接受视频中的丢帧,则可能需要考虑使用UDP。 TCP保证数据包的传输,但您需要支付一些开销。

答案 2 :(得分:1)

你的第一直觉是正确的 - 正如你在延迟过高时降低比特率一样,当延迟下降得非常低时你可以提高比特率。

这个确实意味着您必须确定最大的理想延迟 - 您要根据延迟来衡量图像质量。如果您希望网络提供最佳延迟,请将最大理想延迟设置为网络往返时间。