使用MediaElement从Stream播放视频

raf*_*ale 9 c# wpf wcf mediaelement

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

小智 14

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

  • 我知道这是一个一年前的答案,但不是"同一名称空间中具有相同名称的多个不同类型",引用别名存在的原因是什么? (4认同)

小智 14

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

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

我使用了一个名为boxed app的第三方组件,感谢BoxedApp提供了一百万 - http://www.boxedapp.com/boxedappsdk/

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

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

创建一个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

- 对于盒装应用程序,请关注样本,就是这样......你在一个快乐的世界......

对于QT Player来说也是如此.

根据响应,如果提供的信息不够,我将添加一个完整的示例.

快乐的编码....


Yah*_*hia 7

如果你可以让WCF通过a传递媒体对象,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 /库/ cc190669%28V = VS.95%29.aspx


stu*_*ark 5

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

编辑:此页面有一个如何在WPF中托管ActiveX控件的示例

  • 我可以看到运行VLC作为ActiveX组件的WPF应用程序的示例吗?我想看看它是什么样子,以及在我真正追求它之前如何运行它。 (3认同)