通过套接字传输视频帧

本文关键字:视频 传输 套接字 | 更新日期: 2023-09-27 18:00:10

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

但这里有很多问题。

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

我能做什么?!数据在同一台计算机中,所以不需要从局域网等进行远程访问。我只想找到一种方法,在同一机器的不同应用程序之间每秒传输大约30MB的数据。(640x480是固定大小的图像x每秒30帧x每像素3字节,约为每秒27000K字节)

  1. UDP多播有更好的性能吗
  2. 是TCP可以给我更好的性能,即使我接受每个客户端并独立发送给他们
  3. 有比Socket更好的方法吗?!内存共享什么的
  4. 为什么UDP广播这么慢?!每个仅约10MBytes第二
  5. 有没有一种快速的方法来压缩具有高性能的帧(每秒编码30fps,另一部分解码)?客户端应用程序位于C++,所以这必须是一种跨平台的方式

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

编辑:

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

通过套接字传输视频帧

我在工业环境中进行多播实验,这是一个很好的选择,而不是一个状态不可靠的网络

本地主机中,共享内存可能是一个不错的选择,因为您可以构建帧的循环队列,并仅使用单个互斥锁从一个帧切换到下一个帧,以保护指针分配(写入方)。有了一个作者,几个读者,就不会出现问题。

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

查看这些链接以获取更多信息

  • http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.aspx
  • http://msdn.microsoft.com/en-us/library/dd997372.aspx
  • 混合C++和C#:如何在.NET中实现共享内存
  • 完全管理的共享内存.NET实现

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

通常,编写程序会创建它,读者会按它的名称打开它。防病毒软件以与其他软件相同的方式看待这种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__ );
}

使用live555http://www.live555.com/用于与您喜爱的压缩器ffmpeg相结合的流式传输。