将嵌入的视频资源作为流播放

时间:2011-07-03 16:24:34

标签: c# wpf winforms silverlight video-streaming

编辑:我更改了问题以更好地澄清问题。 如何使用DirectShow.Net库从字节数组(取自嵌入式资源)播放视频?

由于我要阻止用户访问视频文件,我需要将视频文件作为资源嵌入并播放。

提前致谢。

3 个答案:

答案 0 :(得分:4)

这有点不标准,但您可以使用类似WCF的东西在桌面应用程序中自我托管端点。然后将视频输入源设置为自托管端点的“URL”。这适用于WPF或WinForms。虽然不确定Silverlight。

自托管端点可以从您的嵌入资源中提取媒体并从那里传输媒体。

答案 1 :(得分:3)

对我来说,问题不在于如何使用DirectShow库(the `DirectShow.Net Forum是专门为此设计的),而是如何使用嵌入式资源。

几年前,我在合同工作中碰到了类似的事情,雇主担心某些客户可能窃取他的专有信息。我的信息包含在数百个PDF文档中,但这个想法与视频文件的作用相同。

以下是我解决问题的方法:

  • 首先,将视频文件放在资源列表中:我使用Visual Studio,所以我转到Project的属性,单击资源选项卡,选择文件选项,然后选择Add Resource> Add Existing File...

  • 将以下两个namespaces添加到您将使用的代码文件中:

using System.IO;
using System.Diagnostics;
  • 最后,在您要播放视频文件的位置,只需执行以下类似操作:
 Process player = null;
 string tempFile = "~clip000.dat";
 try {
   File.WriteAllBytes(tempFile, Properties.Resources.MyMovie_AVI);
   player = Process.Start(tempFile);
   player.WaitForExit();
 } finally {
   File.Delete(tempFile);
 }

最有可能的情况是,会调用Process.Start方法,而是调用相应的DirectShow方法。这个想法仍然是相同的:将您的资源提取为byte数组,将它们写入新的临时文件,使用该文件,然后在完成后删除该文件

请确保将Delete语句放在finally块中,以便在文件仍在播放时发生任何错误或用户关闭程序时,您的应用程序仍会清除旧文件。

修改

我认为这可能是一种可行的方法:

using (MemoryStream ms = new MemoryStream(Properties.Resources.MyMovie_AVI)) {
  // Now you have to find a way in `DirectShow` to use a Stream
}

答案 2 :(得分:1)

您可以使用其他库吗?

我使用WPF MediaKit来做一些安全的实时h264视频流的非标准流式传输。开发人员(Jermiah Morill)非常敏感,我可以执行的定制很广泛(因为你得到了源代码)。

此时,您可以将视频作为嵌入式资源嵌入,将字节数组(可能是其中的一部分或整个文件)加载到内存中,然后从内存中播放。