2010-12-18 61 views
1

我需要捕获视频并每xxx分钟将其保存到硬盘驱动器。这将是赢得服务,这是永远的捕获和保存。会有几个相机,所以我认为每个相机使用处理线程。所以如果我决定使用Thread而不是Timer,我应该在保存操作之前使用Thread.Sleep。在我看来,这不是一个好习惯。多线程捕获视频

所以问题是我的设计(线程每相机)适合我的情况?关于定时器呢? 谢谢,安德鲁

+2

你如何捕捉视频?你使用哪些API?我问,因为如果你使用DirectShow,那么你甚至可以在没有阻塞当前线程的情况下录制实时视频。 – 2010-12-19 00:50:43

+0

是的,我使用DirectShowNet库。没有blockng,你的意思是什么?我应该如何每5分钟将strean刷新到磁盘。 – 2010-12-19 18:09:21

回答

0

由于全局互斥(例如,在驱动程序中),您的代码可能会偶尔锁定。另外,例如,您在一个线程中打开了输入,将其刷新到某个流中,并且您想从其他线程读取它:发生互斥锁。与定时器一样。考虑到事件驱动的机器太难这里实现,你仍然可以回退到多个实例..

+0

我认为我们必须假设1)驱动程序是线程安全的,2)程序员能够实现线程(考虑互斥和死锁)。至少有一些可以支持驱动程序不是线程安全的假设。 :) – 2011-02-22 10:20:09

0

你可以看一下对开源项目媒体门户的代码在http://www.team-mediaportal.com/

看他们子项目名为TvEngine3。

您可以强制它将您的相机作为“调谐器”设备进行图形化,并将其设置为通过api进行记录。

问题是,他们已经制定了数百个DirectShow问题,并且有很多

0

我会明确地去每个相机一个线程作为机会,你会使用少于20-30相机。但它可能不是必需的,因为阅读相机(通常)是非阻塞操作。

在SO上的C#上有几个关于网络摄像机和视频的问题。尝试查看How do I capture video from a webcam?

请注意,您可能需要预先分配大块数据以避免磁盘碎片。将多个流媒体视频存储到磁盘可能会真正分解内容,然后观看/复制/修改视频会非常慢。