使用MediaElement从Stream播放视频

时间:2011-08-19 06:07:47

标签: c# wpf wcf mediaelement

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

5 个答案:

答案 0 :(得分:14)

可能为时已晚,希望如果您仍在寻找答案,这可能会有所帮助。

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

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

我必须稍微更新代码才能使其适用于byte []。将以下构造函数从BoxedApp

复制到CustomFileStream类
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 Player也是如此。

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

快乐的编码......

答案 1 :(得分:12)

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

答案 2 :(得分:7)

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

对于此类网址不可用/可能的情况:

目前无法分配流 - 虽然有一些黑客可以实现这一点,但对于基于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

答案 3 :(得分:4)

我知道这不是您要求的,但您可以在WPF中的窗口内托管VLC ActiveX组件,然后使用该VLC控件连接到流并显示流。这就是我通过WPF进行流式处理的方式。

修改:this page has an example of how to host an ActiveX control inside WPF

答案 4 :(得分:0)

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

当您选择“缓冲区”选项并将“内容的秒数”设置为2.以下注册表值将添加到媒体播放器下。 HKEY_CURRENT_USER \软件\微软\ 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