UWP如何打开多个视频?播放文件夹内所有文件功能异常如何解决
UWP 文件夹内视频顺序播放实现方案
问题根源
你当前代码的问题在于:foreach循环是同步执行的,调用Play()方法后不会阻塞等待当前视频播放完成,循环会在极短时间内遍历完所有文件,连续覆盖MediaPlayer的Source属性,只有最后一次设置的源会保留,因此只会播放最后一个视频。
实现步骤
你需要通过监听视频播放完成事件触发下一个视频的加载,而非同步循环设置播放源,具体调整如下:
- 首先在页面类中定义全局字段,存储播放列表和当前播放索引:
// 页面类内部全局字段 private List<StorageFile> _videoFileList = new List<StorageFile>(); private int _currentPlayIndex = 0;
- 页面初始化阶段注册
MediaPlayer的播放完成事件,比如在页面构造函数、OnNavigatedTo方法中添加:
mediaPlayerElement.MediaPlayer.MediaEnded += MediaPlayer_MediaEnded;
- 修改文件夹选择后的逻辑,仅存储文件列表并触发第一个视频播放即可,无需遍历所有文件设置源:
FolderPicker folderPicker = new FolderPicker(); folderPicker.SuggestedStartLocation = PickerLocationId.Desktop; // 建议按需过滤视频格式,避免非视频文件加载报错,不要直接用*匹配所有文件 folderPicker.FileTypeFilter.Add(".mp4"); folderPicker.FileTypeFilter.Add(".avi"); folderPicker.FileTypeFilter.Add(".wmv"); folderPicker.FileTypeFilter.Add(".mkv"); var folder = await folderPicker.PickSingleFolderAsync(); if (folder != null) { var allFiles = await folder.GetFilesAsync(); _videoFileList = allFiles.ToList(); _currentPlayIndex = 0; if (_videoFileList.Any()) { PlayVideoByIndex(_currentPlayIndex); } }
- 封装播放方法和播放完成事件的处理逻辑:
// 按索引播放指定视频 private void PlayVideoByIndex(int index) { // 索引越界代表所有视频播放完成,直接返回 if (index < 0 || index >= _videoFileList.Count) return; var targetFile = _videoFileList[index]; mediaPlayerElement.MediaPlayer.Source = MediaSource.CreateFromStorageFile(targetFile); mediaPlayerElement.MediaPlayer.PlaybackSession.PlaybackRate = 2; mediaPlayerElement.MediaPlayer.Play(); } // 单个视频播放完成后的回调事件 private void MediaPlayer_MediaEnded(MediaPlayer sender, object args) { _currentPlayIndex++; // 事件回调在非UI线程触发,需要切回UI线程操作播放控件 DispatcherQueue.TryEnqueue(() => { PlayVideoByIndex(_currentPlayIndex); }); }
补充说明:如果需要兼容播放错误自动跳过的逻辑,可以额外监听
PlaybackSession.PlaybackStateChanged事件,检测到播放状态异常时也触发下一个视频的加载。
内容的提问来源于stack exchange,提问作者Ренат Ахметшин
相关产品推荐
相关产品推荐

