如何使wpf MediaElement播放时,它的源是一个https uri

本文关键字:uri https 一个 MediaElement wpf 何使 播放 | 更新日期: 2023-09-27 18:16:03

在wpf独立应用程序(.exe)中,我在主窗口中包含了一个MediaElement

<Window x:Class="Media.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Main Window" Height="350" Width="525">
    <Grid>
        <MediaElement x:Name="Player" Stretch="Uniform" LoadedBehavior="Manual" UnloadedBehavior="Stop"/>
    </Grid>
</Window>

和从后面的代码我设置它的Source为任何https Uri:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var source = new Uri("https://stream_which_can_be_opened_with_windows_media_player.com", UriKind.Absolute);
        Player.Source = source;
        Player.Play();
    }
}

调用Play()方法时,抛出NullReferenceException而不是播放媒体内容。初始化MediaElement,从Play()方法抛出NullReferenceException,见下文。

视频的相同Uri可以在Windows Media Player中打开(File->Open Url)。

问题似乎是在MediaPlayerState.OpenMedia方法(MediaElement内部使用的对象),它试图检查从SecurityHelper.ExtractUriForClickOnceDeployedApp检索的appDeploymentUri是否具有HTTPS方案。应用程序没有使用ClickOnce进行部署(它有一个独立的安装程序),并且appDeploymentUri为空,因此NullReferenceException

这是来自PresentationFramework.dll, System.Windows.Media.MediaPlayerState.OpenMedia

    if (SecurityHelper.AreStringTypesEqual(uriToOpen.Scheme, Uri.UriSchemeHttps))
    {
        // target is HTTPS. Then, elevate ONLY if we are NOT coming from HTTPS (=XDomain HTTPS app to HTTPS media disallowed)
        //source of the issue
        Uri appDeploymentUri = SecurityHelper.ExtractUriForClickOnceDeployedApp();
        //appDeploymentUri is null
        if (!SecurityHelper.AreStringTypesEqual(appDeploymentUri.Scheme, Uri.UriSchemeHttps))

是否有人有任何关于变通/解决方案,使其工作?

如何使wpf MediaElement播放时,它的源是一个https uri

我已经使用MediaElement好几次了,我可以诚实地说它是一坨屎,比我遇到的任何其他WPF组件都有更多的bug。它不仅有bug,而且缺少很多Silverlight所拥有的特性。HTTPS可以在Silverlight中使用。

我看了一遍代码,我没有看到改变它的方法。也许有一些MAD反射黑客可以让你做到这一点,但那是黑客,我不建议这样做。另外,这似乎是一个真正的错误,也许让微软的人知道它。

最简单的解决方案是使用OWIN制作一个"内存web服务器"。然后,您可以流式传输http://localhost:1337并包装底层的https://内容。https内容仍然是安全的,因为你是从"内存网络服务器"流媒体,没有"真正的"网页入侵。它应该仍然是有效的& &;安全。