【问题标题】:UWP MediaPlayerElement - Poster Stay Put Until PlayedUWP MediaPlayerElement - 海报一直放置直到播放
【发布时间】:2020-06-29 15:34:03
【问题描述】:

UWP MediaPlayerElement 同时具有 PosterSource 和 VideoSource。这个问题主要是关于保持 PosterSource 显示直到播放。

Docs 状态:

  • 未设置有效源时。例如,未设置源, 源设置为 Null,或源无效(如 触发 MediaFailed 事件)。
  • 加载媒体时。例如,一个 设置了有效的源,但尚未触发 MediaOpened 事件。
  • 当媒体流式传输到另一台设备时。
  • 当媒体仅为音频时。

我要确定的是如何在自动播放关闭时即使在媒体完成下载后仍显示海报图像。可悲的是,第一帧+是黑屏。所以我希望海报一直显示,直到按下播放按钮。

想法?

编辑:

Faywang 非常有帮助。

除了他的 cmets,我还做了以下工作:

private void PlayPauseButton_EnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var button = (sender as AppBarButton);
    if(!(bool)e.newValue)
    {
        button.IsEnabled = true;
    }
}

【问题讨论】:

  • 根据文档,它提到“在加载媒体时。例如,设置了有效的源,但尚未触发 MediaOpened 事件。”。在您单击播放按钮之前,媒体已经加载,因此海报将消失。如果您想在单击播放按钮之前保留海报,也许您可​​以设置 PosterSource 而不要首先将 Source 设置为 MediaPlayerElement。然后监听播放按钮的点击事件,当事件触发时,可以在该事件中设置Source并播放。
  • @Faywang。 MediaPlayerElement (MPE) 不允许我调整播放按钮。如果没有来源,它会被禁用。 IsPlayEnabled 没有 TransportControl 选项,就像 MediaPlayer.SystemMediaMTransportControls 一样。我尝试将其设置为 true,但它不会影响 MPE。

标签: video uwp media poster


【解决方案1】:

如果你想保留海报直到你点击播放按钮,你可以设置 PosterSource 并且不要首先将 Source 设置为 MediaPlayerElement。然后监听播放按钮的点击事件,当事件触发时,可以在该事件中设置Source并播放。

另外,通过测试,当你明确设置了 AutoPlay 并且没有设置 Source 时,播放按钮将被禁用。但是如果不设置自动播放,播放按钮会启用,所以最好删除这段代码AutoPlay="False"

如果你想监听播放按钮的点击事件,你可以获取MediaTransportControls的默认样式并订阅播放按钮的点击事件。您可以到 generic.xaml 文件获取 MediaTransportControls 的默认样式。默认样式中,有一个名为PlayPauseButtonAppBarButton,代表播放和暂停按钮,可以在里面添加点击事件,触发事件时,设置来源,播放/暂停视频。

例如:

.xaml:

<Page.Resources>
    <Style TargetType="MediaTransportControls" x:Key="MyStyle">
        ......
        <Setter Property="Template">
            ......
            <AppBarButton x:Name='PlayPauseButton' Style='{StaticResource  AppBarButtonStyle}' 
                          Click="PlayPauseButton_Click"
                          MediaTransportControlsHelper.DropoutOrder='23'>
                <AppBarButton.Icon>
                    <SymbolIcon x:Name="PlayPauseSymbol" Symbol="Play" />
                </AppBarButton.Icon>
            </AppBarButton>
            ......
        </Setter>
    </Style>
</Page.Resources>

<MediaPlayerElement x:Name="mediaSimple" Width="400" PosterSource="Assets/3.jpg" AreTransportControlsEnabled="True">
    <MediaPlayerElement.TransportControls>
        <MediaTransportControls Style="{StaticResource MyStyle}"></MediaTransportControls>
    </MediaPlayerElement.TransportControls>
</MediaPlayerElement>

.cs:

private void PlayPauseButton_Click(object sender, RoutedEventArgs e)
{
    SymbolIcon symbol = (sender as AppBarButton).Icon as SymbolIcon;
    if (symbol.Symbol == Symbol.Pause)
    {
        mediaSimple.MediaPlayer.Pause();
    }
    else
    {
        if (mediaSimple.Source == null)
        {
            mediaSimple.Source = MediaSource.CreateFromUri(new Uri("ms-appx:///Assets/fishes.wmv"));
        }

        mediaSimple.MediaPlayer.Play();
    }
}

【讨论】:

  • 以后不设置源,点击播放后,是否意味着缓冲开始前的等待时间更长?我个人不使用 Unity (UWP),但如果这是我的问题:我会在视频缓冲时将图像对象放在视频上方(并覆盖)的图层上。单击图像时,将向视频对象发送“播放”命令,然后将删除图像或使其“不可见”(不阻止对某些下方对象的任何单击,不透明度也为零等)。换句话说,从图像对象(放置在更高层)创建自定义海报。
  • @Faywang,这很棒。我正在按照您的建议执行。唯一的问题是在视频完成一次之后。它确实回到了海报上,但播放按钮被禁用了。
  • @Faywang,我决定捕获 PlayPauseButton_EnabledChanged 事件。我注意到有些东西改变了按钮的状态,所以我快速检查了新值,并在必要时重新启用它。 private void PlayPauseButton_EnabledChanged(object sender, DependencyPropertyChangedEventArgs e) { var button = (sender as AppBarButton); if(!(bool)e.newValue) { button.IsEnabled = true; } }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
相关资源
最近更新 更多