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

问题描述

我现在正在进入WPF,但我有一个问题,尽管看似简单,但我仍在学习

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

如果我定义完整路径,例如:

C:\myapp\media.mp4

在Source中使用此路径正常工作

当我将视频和音乐作为资源添加时,问题就开始了,

enter image description here

enter image description here

我正在使用以下代码:

<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播放“资源”音频/视频文件时出现问题。似乎media元素不支持Source="pack://application:,/Assets/media.mp4"之类的打包URI。

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

Using Relative File Path in MediaTimeline

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

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

示例:

将文件构建操作设置为Embedded Resource

在代码中:

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

设置MediaTimeline名称:

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

注意:不再需要临时创建的文件。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...