使用 MediaElement 播放 Stream 中的视频

问题描述 投票:0回答:6

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

c# wpf wcf mediaelement
6个回答
17
投票

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


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;
}

创建一个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 也是如此。


7
投票

如果您可以使 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


5
投票

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

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


0
投票

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

当您选择“Buffer”选项并将“Seconds of content”设置为2时。媒体播放器下将添加以下注册表值。 HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Preferences 使用默认缓冲时间=0 自定义缓冲时间=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


0
投票

通过媒体元素播放流中的视频有什么新想法吗?

© www.soinside.com 2019 - 2024. All rights reserved.