通过套接字传输视频帧

时间:2013-02-18 17:27:25

标签: c# image sockets udp video-streaming

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

但这里有很多问题。

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

我该怎么办?!数据在同一台计算机上,因此无需从LAN等远程访问。我只想在同一台机器的不同应用程序之间每秒传输大约30MB的数据。 (640x480是固定大小的Image x 30fps x 3byte每像素大约是27000KByte每秒)

  1. UDP Multicast是否具有更好的性能?!
  2. 即使我接受每个客户,TCP也能给我更好的表现 并独立发送给他们?!
  3. 有没有比Socket更好的方法?!记忆共享还是什么?!
  4. 为什么UDP广播要慢很多?!每个只有大约10MB 第二?!
  5. 是否有一种快速的方法来压缩具有高性能的帧(到 在一秒内编码30fps并在其他部分解码)?客户端应用程序在 C ++所以这必须是跨平台的方式。
  6. 我只是想了解其他开发人员的经验和想法,所以请写下您的想法。 谢谢你的帮助。

    编辑:

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

2 个答案:

答案 0 :(得分: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__ );
}

答案 1 :(得分:0)

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