video捕获+上传+处理+流媒体返回 – .NET和C#

我们正试图找出.NET堆栈中可用的任何技术/库(甚至是第三方dll上的包装器),它们将帮助我们构建一个可以

  • 1 – 从用户的video设备捕获图像
  • 2 – 将其实时上传到服务器
  • 3 – 处理video(在服务器中) – 例如:为video添加水印
  • 4 – 将其流回用户/其他用户

优选地,步骤2和4之间的时间延迟/等待时间应该是最小的

第一个要求(捕获)似乎非常简单。 挑战在于确定一种合适的方式来进行上传,进行处理并将其流回。 任何有效的建议或想法?

最近来了acrsoss FFmpeg库,它有一个C#包装器。 FFmpeg可用于处理方面吗?

我会这样做:

  1. 使用silverlight或flash捕获摄像机输入,例如此处详述 。
  2. 您可以通过服务器正在侦听的套接字发送字节流。
  3. 在接收端,只需使用套接字接受程序作为路由器程序,并连接多个侦听工作程序。 在worker和router-program之间,例如AMQP和RabbitMQ 。 将例如流编码的异步消息(例如,具有被动扩展)发送到兔节点,然后可以将所有消息作为对话/用户会话的一部分传递到单个计算机,或者在可用工作者之间交错。 这是手册 。 当video被编码时,它将通过消息总线异步流式传输。 根据英特尔测试,总线本身应该在高吞吐量下运行良好,但是它们必须使用交错式tcp通道模式(它们在千兆位局域网上进行测试)。 这里的其他用户建议使用FFlib 。 您可能还会考虑让工作人员转换为webM ,但如果FFlib工作,那可能会容易得多。 每个工作人员通过AMQP发布下一个编码video片段。 服务器运行程序,例如我之前谈过的路由器程序,开始向客户端发送(参见第4条)
  4. 有一个客户端程序,例如silverlight / flash connect(例如,通过为客户端 – >服务器数据或通过HTTP打开的同一个套接字),并使用解码器读取字节流。 渲染输出。

来自Mitov的VideoLab可以完成所有这些并且可以免费供个人使用(不是免费用于商业用途,但定价不是太重)。

我已经购买并使用了Delphi版本,并且知道它工作得非常好,所以我很确定.NET版本可以满足您的需求。

这种任务并不是微不足道的(正如此处缺乏回应所示),因此期望与DirectX / Microsoft Media Encoder相当困难 – 但是使用此工具包和作者的一些帮助,您最终会成功。

http://www.mitov.com/html/videolab.html

似乎Splicer可以处理静态video并将其转换 – 我不确定处理实时上传的video – http://splicer.codeplex.com/

看看Vertigo的 Video.Show 。 它是一个用于用户生成的video内容的开源网站。 它使用Expression Encoder处理压缩/video编辑。 这不完全是你需要的,但这是一个好的开始!

您可以使用Silverlight进行捕获,如上所述,然后使用Expression Encoder将其直接推送到流服务器或流。

它应该拥有你需要的一切:

WMV的智能编码/智能再压缩,如果源也是WMV并且没有执行帧操作[4],削减编辑,串行批量编码,来自网络摄像头和DV摄像机的实时编码

由于DirectShow,解码/导入格式支持

使用优化的客户端(Silverlight)和服务器(具有流畅的流式传输的IIS)平滑流式传输(使用HTTP的720p +video)

WebDAV发布,发布Silverlight Streaming插件,Amazon S3

导入在Expression Design中创建的XAML叠加层,并自定义其时序,动画,不透明度,放置和循环

JavaScript触发事件

Windows Media 11 SDK和VC-1 SDK集成,原生MPEG-2解码器

使用SAMI或W3C定时文本格式为video添加标题

实时预览和比较编码设置

屏幕截图

编码引擎的对象模型,SDK可单独下载

这个问题在细节方面有点短(这是一个网络服务器,服务器是什么操作系统?等等),但我会根据我认为你想要做的事情进行一次尝试。

您可能会考虑的一件事是一次进行捕获和处理。 如果用户正在运行您的客户端应用程序,请通过DirectShow进行捕获和处理。 然后,您需要做的就是上传video,您可以跳过整个服务器进程。 这假设’用户’在您的控制之下 – 这不是一个随机的人上传video,而是一个员工或其他人信任。

如果不是这种情况,那么ffmpeg当然可以用于在服务器上为video添加水印。 你真的不需要’包装’。 您可以从服务器应用程序中将其称为命令行应用程序,并等待它完成。

这个过程真的不复杂……它的细节很重要(例如 – ‘流’对你意味着什么?你真的是指’流’,还是这是通过http?那是一个很大的话题就在那里)