使用MediaElement播放流中的视频
是否可以使用WPF MediaElement从System.IO.Stream对象播放流视频?正在从存储媒体文件的WCF服务中检索Stream对象。使用MediaElement播放流中的视频
如果您可以让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/changesets和http://msdn.microsoft.com/en-us/library/cc190669%28v=vs.95%29.aspx
我知道这是不是你要的,但你可以在WPF的窗口中托管一个VLC ActiveX组件,然后使用该VLC控件连接到该流并显示该流。这就是我通过WPF获得流媒体工作的方式。
编辑:this page has an example of how to host an ActiveX control inside WPF
在任何人浪费时间发现了这一点,为自己:这是不可能举办的Silverlight的MediaElement在WPF应用程序。原因是它是PresentationFramework.dll(WPF中不可避免的)和System.Windows.dll(Silverlight版本)中出现的许多类型中的一种,它们具有相同的名称和相同的名称空间,但是是不同的类型。 (有人应该解释为什么我们有命名空间到微软!)
这是真的。不幸的是,我不得不以艰难的方式找到这一点。 :( – rafale
我知道这是一个古老的答案,但不是“在同一名称空间中具有相同名称的多个不同类型”是否存在引用别名的原因? –
始终可以制作Silverlight网站并在其中使用MediaElement并在WPF应用程序中添加WebBrowser控件和源代码到该Silverlight网站并完成 –
它可能为时已晚,希望这可能有助于,如果你仍然在寻找答案。
是的,你可以使用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播放器也是一样的。
根据回答,如果提供的信息不够,我会添加一个完整的示例。
快乐编码....
很好的答案,非常感谢! – Mafii
由于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
我可以看到一个运行VLC作为ActiveX组件的WPF应用程序的例子吗?我想看看它看起来是什么样子,以及在我真的去做它之前让它运行的内容。 – rafale
嗨,斯图尔特,你可以发布你的例子使用VLC的地方,以便我可以看看。谢谢。 –