问题描述
我现在正在进入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
播放“资源”音频/视频文件时出现问题。似乎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"/>
注意:不再需要临时创建的文件。