2011-08-19 204 views

回答

6

如果您可以让WCF通过http-URL (GET)传递媒体对象,那么您可以将该URL分配给MediaElement.Source媒体资源 - 请参阅http://msdn.microsoft.com/en-us/library/system.windows.controls.mediaelement.source.aspx

对于在这样的URL不可用/可能的情况:

分配一个流是目前不可能的 - 虽然有一些黑客要做到这一点,对于一个基于DirectShow的例子中看到http://social.msdn.microsoft.com/forums/en-US/wpf/thread/6191ef1a-0010-4294-a5b4-451bbadca33a/http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/15/WPF-Hackery-Part-I.aspx

另一种选择是莫名其妙地举办Silverlight MediaElement并使用SetSource方法,可以采取流,发挥它...看到http://silverlightviewport.codeplex.com/SourceControl/list/changesetshttp://msdn.microsoft.com/en-us/library/cc190669%28v=vs.95%29.aspx

4

我知道这是不是你要的,但你可以在WPF的窗口中托管一个VLC ActiveX组件,然后使用该VLC控件连接到该流并显示该流。这就是我通过WPF获得流媒体工作的方式。

编辑:this page has an example of how to host an ActiveX control inside WPF

+2

我可以看到一个运行VLC作为ActiveX组件的WPF应用程序的例子吗?我想看看它看起来是什么样子,以及在我真的去做它之前让它运行的内容。 – rafale

+0

嗨,斯图尔特,你可以发布你的例子使用VLC的地方,以便我可以看看。谢谢。 –

12

在任何人浪费时间发现了这一点,为自己:这是不可能举办的Silverlight的MediaElement在WPF应用程序。原因是它是PresentationFramework.dll(WPF中不可避免的)和System.Windows.dll(Silverlight版本)中出现的许多类型中的一种,它们具有相同的名称和相同的名称空间,但是是不同的类型。 (有人应该解释为什么我们有命名空间到微软!)

+1

这是真的。不幸的是,我不得不以艰难的方式找到这一点。 :( – rafale

+4

我知道这是一个古老的答案,但不是“在同一名称空间中具有相同名称的多个不同类型”是否存在引用别名的原因? –

+1

始终可以制作Silverlight网站并在其中使用MediaElement并在WPF应用程序中添加WebBrowser控件和源代码到该Silverlight网站并完成 –

12

它可能为时已晚,希望这可能有助于,如果你仍然在寻找答案。

是的,你可以使用WPF媒体元素从内存流中播放视频。

我使用一个名为盒装应用第三方组件,一百万个感谢BoxedApp - http://www.boxedapp.com/boxedappsdk/

我要更新的代码一点点,使之成为一个字节[]工作。下面的构造函数CustomFileStream类从BoxedApp

复制
public CustomFileStream(byte[] data) 
{ 
    _Stream = new MemoryStream(data); 
    _Length = _Stream.Length; 
    _data = data; 
    _Offset = 0; 
} 

创建一个WPF应用程序,并添加一个媒体元素和一个按钮,复制下面的代码

public MainWindow() 
{ 
    BoxedAppSDK.NativeMethods.BoxedAppSDK_Init(); 

    InitializeComponent(); 
} 

private void button2_Click(object sender, RoutedEventArgs e) 
{ 
    var MyFileStream = new CustomFileStream(File.ReadAllBytes(@"wildlife.wmv")); 

    IntPtr ptr = BoxedAppSDK.NativeMethods.BoxedAppSDK_CreateVirtualFileBasedOnIStream(
      @"1.wmv", 
      BoxedAppSDK.NativeMethods.EFileAccess.GenericWrite, 
      BoxedAppSDK.NativeMethods.EFileShare.Read, 
      IntPtr.Zero, 
      BoxedAppSDK.NativeMethods.ECreationDisposition.New, 
      BoxedAppSDK.NativeMethods.EFileAttributes.Normal, 
      IntPtr.Zero, 
      MyFileStream); 

    using (new SafeFileHandle(ptr, true)) 
    { 
     mediaElement1.Source = new Uri(Path.GetFullPath("1.wmv")); 
     mediaElement1.LoadedBehavior = MediaState.Manual; 
     mediaElement1.Play(); 
    } 
} 

- 盒装应用程序请遵循样本,这就是它..你在一个快乐的世界里......

这对QT播放器也是一样的。

根据回答,如果提供的信息不够,我会添加一个完整的示例。

快乐编码....

+0

很好的答案,非常感谢! – Mafii

0

由于WPF MediaElement的内部使用Windows媒体播放器。如果您将媒体播放器的缓冲区设置从默认缓冲区设置更改为自定义。打开Windows媒体播放器工具选项性能。

当您选择“缓冲区”选项并将“秒的内容”设置为2.以下注册表值将被添加到媒体播放器下。 HKEY_CURRENT_USER \ SOFTWARE \微软\ MediaPlayer的\首 UseDefaultBufferTime = 0 CustomBufferTime = 2000

你可以使用DOTNET注册表类进行更改。 请参阅此链接: https://social.msdn.microsoft.com/Forums/vstudio/en-US/1b4b8fb9-ff8f-4861-8e99-4a7a4fc75596/setting-windows-media-player-properties-in-wpf?forum=wpf#ac879a7f-37bc-4ccc-854d-ab6e047086e5