【问题标题】:Socket and ports setup for high-speed audio/video streaming用于高速音频/视频流的套接字和端口设置
【发布时间】:2013-07-09 06:57:18
【问题描述】:

我在服务器和客户端之间建立了一对一的连接。服务器正在流式传输实时音频/视频数据。

我的问题可能听起来很奇怪,但我应该使用多个端口/套接字还是只使用一个?使用多个端口更快还是使用单个端口提供更好的性能?我应该有一个端口只用于消息,一个用于视频,一个用于音频,还是将整个内容打包在一个端口中更简单?

我当前的一个问题是我需要首先发送当前帧的大小,因为大小(以字节为单位)可能会从一帧更改为下一帧。我对网络相当陌生,但我还没有找到任何机制可以自动检测正在传输的特定对象的正确范围。例如,如果我发送一个 2934 字节长的数据包,我真的需要告诉接收者该数据包的大小吗?

我首先尝试在帧进入时尽可能快地打包帧,但我发现接收端有时无法获得适当的字节数。大多数时候,它的读取速度比我发送它们的速度要快,只得到部分帧。什么是尽可能快地只获得适当数量的字节的最佳方法?

还是我看起来太低了,并且有一个更高级别的类/框架用于处理对象传输?

【问题讨论】:

  • 您应该做的最重要的事情就是完全忘记数据包。 TCP 连接是一个,因此任何数据描述都需要由you(协议)处理。
  • 另外,UDP 数据报通常用于流式传输。
  • @JonathonReinhart:它可能是一个流,但我需要将它切成数据包 - 或帧 - 否则客户端只会处理垃圾 - 半帧或重叠帧。我根本不知道这样做的最好或最有效的方法是什么。显然,我需要做的不仅仅是将数据推送到管道中并希望获得最好的结果。
  • 这就是我要说的,你需要想出一个协议,上面写着“嘿,这是我身后的数据”。我是说你应该忘记在你的流下面流动的实际 TCP/IP 数据包。
  • 但实际上,你应该考虑using UDP for streaming protocols

标签: c# networking tcp streaming


【解决方案1】:

我认为最好使用对象机制并以交错方式发送数据。这种机制可能比多端口机制工作得更快。

例如:

类数据{ 数据类型,-(音频/视频) 大小,-(数据缓冲区的大小) 数据缓冲区 - (数据取决于类型) }

'DataType' 和 'Size' 总是大小不变。在客户端获取“DataType”和“Size”,然后读取相应发送数据(Adio/Video)的指定大小。

【讨论】:

  • 但是从一帧到另一帧的大小永远不会恒定。你是说我应该浪费带宽来保持对象大小不变?
【解决方案2】:

只是在我的头上编造一些东西。像这样将“数据包”推到电线上:

1 byte - packet type (audio or video)
2 bytes - data length
(whatever else you need)
|
|  (raw data)
| 

因此,每当您在另一端收到其中一个数据包时,您就可以准确地知道要读取多少数据,以及下一个数据包应该从哪里开始。

[430 byte audio L packet]
[430 byte audio R packet]
[1000 byte video packet]
[20 byte control packet]
[2000 byte video packet]
...

但是为什么要重新发明轮子呢?已经有protocols 在做这些事情了。

【讨论】:

  • RTSP 听起来像是我在搜索中遗漏的东西。非常感谢您向我指出这一点。
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多