我的C#代码中有30FPS的视频帧,我想在本地主机中广播,所以所有其他应用程序都可以使用它。我虽然因为它是一个视频而且不关心任何数据包丢失而且不需要连接/接受客户端,所以UDP是一个不错的选择。
但这里有很多问题。
我该怎么办?!数据在同一台计算机上,因此无需从LAN等远程访问。我只想在同一台机器的不同应用程序之间每秒传输大约30MB的数据。 (640x480是固定大小的Image x 30fps x 3byte每像素大约是27000KByte每秒)
我只是想了解其他开发人员的经验和想法,所以请写下您的想法。 谢谢你的帮助。
编辑:
有关数据的更多信息:数据采用Bitmap RGB24格式,它们通过30FPS从设备流式传输到我的应用程序。我想将这些数据广播到其他应用程序,他们需要再次使用RGB24格式的图像。没有标题或任何东西,只有固定大小的位图数据。所有操作必须即时执行。无论使用有损压缩算法还是其他任何东西。
答案 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。