在C# WPF应用程序中嵌入视频到窗口的实现问题
WPF中播放嵌入项目视频的解决办法
核心问题说明
WPF的MediaElement控件依赖Windows Media Player底层引擎,该引擎无法直接读取嵌入到程序集(BuildAction设为Resource/Embedded Resource)中的视频文件,这就是你测试时GIF正常、视频失效的原因——GIF是由WPF的Image控件直接解码处理,逻辑和视频完全不同。
可行解决方案
方案1:将视频设为Content资源(推荐,无需额外代码)
- 右键项目中的视频文件,设置:
- BuildAction:
Content - Copy to Output Directory:
Copy if newer
- BuildAction:
- 在XAML中使用相对路径或
pack://siteoforigin路径指定MediaElement的Source:<!-- 相对路径示例,假设视频在项目根目录的Videos文件夹下 --> <MediaElement Source="/Videos/demo.mp4" LoadedBehavior="Play" /> <!-- pack路径写法 --> <MediaElement Source="pack://siteoforigin:,,,/Videos/demo.mp4" LoadedBehavior="Play" />
方案2:嵌入资源转临时文件播放(必须嵌入到程序集时用)
如果必须将视频嵌入到程序集(比如不想让用户轻易找到视频文件),可以先把嵌入的资源读取为流,写入临时文件后再播放:
- 设置视频文件的BuildAction:
Embedded Resource - 在窗口加载或播放触发时,添加以下C#代码:
private void Window_Loaded(object sender, RoutedEventArgs e) { // 资源名称格式:项目命名空间.文件夹路径.文件名(注意大小写匹配) string resourceName = "YourProjectNamespace.Videos.demo.mp4"; using var resourceStream = System.Reflection.Assembly.GetExecutingAssembly() .GetManifestResourceStream(resourceName); if (resourceStream == null) return; // 创建临时文件 string tempVideoPath = Path.Combine(Path.GetTempPath(), $"temp_{Guid.NewGuid()}.mp4"); using var fileStream = new FileStream(tempVideoPath, FileMode.Create, FileAccess.Write); resourceStream.CopyTo(fileStream); // 播放临时文件 mediaElement.Source = new Uri(tempVideoPath); // 播放完成后删除临时文件 mediaElement.MediaEnded += (s, args) => { try { File.Delete(tempVideoPath); } catch { /* 忽略删除失败的情况,比如文件被占用 */ } }; }
替代方案
如果不想依赖Windows Media Player的限制,可以考虑:
- 使用WPF MediaPlayer类配合
DrawingVisual自行渲染视频流(需要处理帧更新,代码复杂度较高) - 集成第三方视频控件,比如VLC的WPF绑定库(需额外安装NuGet包,兼容性更好)
内容的提问来源于stack exchange,提问作者Mojtabah
相关产品推荐
相关产品推荐

