视频和音乐用作资产时未出现在 WPF 中

Video and music not appearing in WPF when used as an asset

我现在正在进入WPF,我有一个问题,虽然看起来很简单,但我还在学习

我正在创建一个打开时会显示视频和歌曲的应用程序。

如果我像这样定义完整路径:

C:\myapp\media.mp4

在Source中使用这个路径可以正常工作

当我将视频和音乐添加为资源时出现问题,它停止工作

我正在使用以下代码:

<Grid>
<StackPanel Height="768" VerticalAlignment="Bottom" Width="1024" HorizontalAlignment="Left">
    <MediaElement x:Name="Mymedia" VerticalAlignment="Top" Width="1024" Height="768">
        <MediaElement.Triggers>
            <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <MediaTimeline Source="Assets/media.mp4" Storyboard.TargetName="Mymedia"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </MediaElement.Triggers>
         <MediaElement.Triggers>
            <EventTrigger RoutedEvent="FrameworkElement.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <MediaTimeline Source="Assets/isurge.mp3" Storyboard.TargetName="Mymedia"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </MediaElement.Triggers>
    </MediaElement>
</StackPanel>

视频没有使用资源运行有人能告诉我为什么吗?

看来您的路径可能不正确。尝试使用如下内容:

<MediaTimeline Source="pack://application:,,,/Assets/media.mp4" Storyboard.TargetName="Mymedia"/>

在构建 .NET Core WPF 应用程序时这对我有用,其他版本的 .NET 可能会有所不同。

使用 MediaElement 播放“资源”audio/video 文件时出现问题。媒体元素似乎不支持像 Source="pack://application:,,,/Assets/media.mp4".

这样的打包 URI

Microsoft 论坛上描述了类似的问题:

Using Relative File Path in MediaTimeline

How to play a "resource" audio file using MediaElement?

但可以从资源中获取 audio/video 并以编程方式设置 MediaTimeline 源。 这个想法是从资源中提取 audio/media 内容并将其写入临时文件。然后为 MediaTimeline 源设置 URI 以引用临时文件。

示例:

Set a file Build Action to Embedded Resource.

In the code:

  var resourceName = "YourAssemblyName.Assets.isurge.mp3";
  using (var fstream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
  {
      var ext = resourceName.Substring(resourceName.LastIndexOf("."));
      var pathfile = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ext;
      using (FileStream outputFileStream = new FileStream(pathfile, FileMode.Create))
      {
          fstream.CopyTo(outputFileStream);
      }
      mt.Source = new Uri(pathfile, UriKind.RelativeOrAbsolute);
  }

Set the MediaTimeline name:

 <MediaTimeline x:Name="mt" Storyboard.TargetName="audio" RepeatBehavior="Forever"/>

注意:临时创建的文件在不再需要时应删除。