使用MediaElement从Stream播放video

是否有可能使用WPF MediaElement从System.IO.Stream对象播放streamvideo? 正在从存储媒体文件的WCF服务中检索Stream对象。

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

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

分配stream目前是不可能的 – 虽然有一些黑客可以做到这一点,基于DirectShow的示例请参阅http://social.msdn.microsoft.com/forums/en-US/wpf/thread/6191ef1a-0010 -4294-a5b4-451bbadca33a /和http://journalsill.hjtcentral.com/Home/tabid/428/EntryId/15/WPF-Hackery-Part-I.aspx

另一个select是以某种方式托pipeSilverlight MediaElement并使用SetSource方法,它可以采取stream并播放它…请参阅http://silverlightviewport.codeplex.com/SourceControl/list/changesets和http://msdn.microsoft .COM / EN-US /库/ cc190669%28V = VS.95%29.aspx

在任何人浪费时间之前,找出自己的东西:在WPF应用程序中托pipeSilverlight MediaElement是不可能的。 原因是它是PresentationFramework.dll(不可避免的WPF)和System.Windows.dll(Silverlight版本)中出现的具有相同名称和相同名称空间但是不同types的多种types之一。 (有人应该解释为什么我们有命名空间微软!)

这可能太晚了,希望这可能有助于,如果你仍然在寻找答案。

是的,您可以使用WPF媒体元素播放内存stream中的video。

我已经使用了第三方组件称为盒装应用程序, 百万感谢BoxedApp – http://www.boxedapp.com/boxedappsdk/

我必须稍微更新一下代码才能使它适用于byte []。 将以下构造函数从BoxedApp复制到CustomFileStream类

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

创build一个wpf应用程序,并添加一个媒体元素和一个button,并复制下面的代码

 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播放器也是一样的。

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

快乐编码….

我知道这不是你所要求的,但是你可以在WPF窗口中放置一个VLC ActiveX组件,然后使用那个VLC控件连接到这个stream并显示这个stream。 这就是我通过WPF进行stream式处理的方式。

编辑: 这个页面有一个如何在WPF中托pipe一个ActiveX控件的例子

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

当您select“缓冲区”选项并将“秒数内容”设置为2.以下registry值将被添加到媒体播放器下。 HKEY_CURRENT_USER \ Software \ Microsoft \ MediaPlayer \ Preferences UseDefaultBufferTime = 0 CustomBufferTime = 2000

您可以使用dotnetregistry类来进行更改。 请参阅此链接: 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