UWP应用使用AQS筛选视频文件却包含字幕文件的问题排查
解决UWP中筛选视频文件却包含字幕文件的问题
我之前也碰到过类似的困扰,咱们一步步来拆解和解决这个问题:
为什么会拿到srt等字幕文件?
你用的kind:=video这类AQS查询其实是Windows的“广义视频关联文件”筛选——系统会把视频库中和视频相关的附属文件(比如字幕、封面图)也归类进来,而不是只筛选真正包含视频流的媒体文件。这不是你AQS语法写错了,而是默认的kind筛选逻辑就是这么设计的。
几个可行的解决方案
1. 用更精准的AQS筛选真正的视频媒体文件
可以利用视频文件特有的属性来过滤,比如媒体时长——真正的视频文件肯定有播放时长,而字幕文件没有。对应的AQS语法是:
System.Media.Duration:>0
你可以把这个条件加到你的QueryOptions里,示例代码:
var queryOptions = new QueryOptions(CommonFileQuery.OrderByName); queryOptions.ApplicationSearchFilter = "System.Media.Duration:>0"; var videoQuery = KnownFolders.VideoLibrary.CreateFileQueryWithOptions(queryOptions); var videoFiles = await videoQuery.GetFilesAsync();
这个方法不需要硬编码扩展名,能自动识别所有带视频流的文件,兼容性更好。
2. 直接指定视频文件扩展名(更直观)
如果只需要支持常见的视频格式,可以直接用FileTypeFilter来限定扩展名,这样能彻底排除字幕文件:
var supportedVideoExtensions = new[] { ".mp4", ".mkv", ".avi", ".mov", ".wmv", ".flv", ".webm" }; var queryOptions = new QueryOptions(CommonFileQuery.OrderByName, supportedVideoExtensions); var videoQuery = KnownFolders.VideoLibrary.CreateFileQueryWithOptions(queryOptions); var videoFiles = await videoQuery.GetFilesAsync();
缺点是需要维护一个扩展名列表,遇到小众格式可能会漏掉,但胜在简单直接。
3. 拿到文件后二次校验(最稳妥)
如果前两种方法还是有漏网之鱼,你可以在获取文件列表后,逐个验证文件是否为真正的视频文件——通过读取视频属性来判断:
var queryOptions = new QueryOptions(CommonFileQuery.OrderByName); queryOptions.ApplicationSearchFilter = "kind:=video"; var videoQuery = KnownFolders.VideoLibrary.CreateFileQueryWithOptions(queryOptions); var allFiles = await videoQuery.GetFilesAsync(); var realVideoFiles = new List<StorageFile>(); foreach (var file in allFiles) { try { var videoProps = await file.Properties.GetVideoPropertiesAsync(); // 有视频时长的才是真正的视频文件 if (videoProps.Duration > TimeSpan.Zero) { realVideoFiles.Add(file); } } catch (Exception) { // 读取视频属性失败,说明不是视频文件,跳过 continue; } }
这个方法最稳妥,能100%排除非视频文件,但性能会稍差一点(需要逐个读取文件属性)。
内容的提问来源于stack exchange,提问作者Muhammad Touseef
相关产品推荐
相关产品推荐

