2

我的 C# 代码中有 30FPS 的视频帧,我想在本地主机中广播它,以便所有其他应用程序都可以使用它。我虽然因为它是一个视频并且没有任何数据包丢失并且不需要连接/接受来自客户端的问题,所以 UDP 是一个不错的选择。

但是这里有很多问题。

  • 如果我使用 UDP 单播速度就足够了,大约 25FPS(CPU 使用率为 25%,这意味着在我的 4 核 CPU 中的一个线程上 100%,这并不理想。但至少它发送了足够多的数据集)。但是单播无法将数据传送给所有客户端。
  • 如果我用广播速度是很低的。大约 10FPS 与相同的 CPU 使用率。

我能做些什么?!数据在同一台计算机中,因此无需从 LAN 等进行远程访问。我只想要一种在同一台机器的不同应用程序之间每秒传输约 30MBytes 数据的方法。(640x480 是固定大小的 Image x 30fps x 3byte per pixel is about 27000KByte per second)

  1. UDP组播性能更好吗?!
  2. 即使我接受每个客户端并独立发送给他们,TCP 是否可以给我更好的性能?!
  3. 有没有比 Socket 更好的方法?!内存共享什么的?!
  4. 为什么UDP广播那么慢?!每秒只有大约 10 兆字节?!
  5. 有没有一种快速压缩高性能帧的方法(每秒编码 30fps 并在其他部分解码)?客户端应用程序使用 C++,因此这必须是一种跨平台方式。

我只是想在这里了解其他开发人员的经验和想法,所以请写下您的想法。

编辑:

有关数据的更多信息:数据采用位图 RGB24 格式,它们以 30FPS 的速度从设备流式传输到我的应用程序。我想将此数据广播到其他应用程序,他们需要再次将这些图像设为 RGB24 格式。没有标题或任何东西,只有固定大小的位图数据。所有操作都必须即时执行。无论使用有损压缩算法还是任何东西。

4

2 回答 2

2

我在工业环境中试验组播,它是一个不成熟的可靠网络的不错选择。

本地主机中,共享内存可能是一个不错的选择,因为您可以构建一个循环帧队列并仅使用单个互斥体从一个帧翻转到下一个帧以保护指针分配(写入端)。一个作家,几个读者,没有问题。

在使用 C++C# 的 Windows 上,共享内存称为文件映射,但您可以使用系统分页文件(RAM 和/或磁盘)。

请参阅这些链接以获取更多信息

共享内存空间不受保护也不是私有的,但它已命名。

通常,作者进程创建它,而读者通过它的名称打开它。防病毒软件以与所有其他软件相同的方式查看这种 I/O,但不会阻止通信。

这是一个从文件映射开始的示例:

char shmName[MAX_PATH+1];
sprintf( shmName, "shmVideo_%s", name );
shmName[MAX_PATH] = '\0';
_hMap =
   CreateFileMapping(
      INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, size, shmName );
if( _hMap == 0 ) {
   throw OSException( __FILE__, __LINE__ );
}
_owner = ( GetLastError() != ERROR_ALREADY_EXISTS );
_mutex = Mutex::getMutex( name );
Synchronize sync( *_mutex );
_data = (char *)MapViewOfFile( _hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
if( _data == 0 ) {
   throw OSException( __FILE__, __LINE__ );
}
于 2013-02-20T20:42:54.767 回答
0

使用 live555 http://www.live555.com/与您最喜欢的压缩器 - ffmpeg 结合使用。

于 2013-02-19T16:41:13.947 回答