/// <summary> /// 初始化范围权重 /// </summary> private void InitAssetFileRangeWeight(List <AssetFile> assetFileList, List <int> rangeWeightList) { //取得权重个数最大的值 //ranage list 索引相同,但是 start end 之间数字不同的,权重值+1,数字相同的,权重-1 int maxWeightCount = 0;//计算出最大权重 for (int i = 0; i < assetFileList.Count; i++) { AssetFile videoFile = assetFileList[i]; int weight = videoFile.numberRanageList.Count; if (weight > maxWeightCount) { maxWeightCount = weight; } } //初始化权重 rangeWeightList.Clear(); for (int i = 0; i < maxWeightCount; i++) { rangeWeightList.Add(0); } //便利视频文件中包含数字的权重列表 for (int i = 0; i < assetFileList.Count - 1; i++) { AssetFile assetFile = assetFileList[i]; for (int j = 0; j < assetFileList.Count; j++) { AssetFile assetFile2 = assetFileList[j]; int count = assetFile.numberRanageList.Count; int count2 = assetFile2.numberRanageList.Count; List <Ranage> listMin, listMax; if (count > count2) { listMax = assetFile.numberRanageList; listMin = assetFile2.numberRanageList; } else { listMin = assetFile.numberRanageList; listMax = assetFile2.numberRanageList; } //遍历相同索引的范围 for (int k = 0; k < listMin.Count; k++) { Ranage ranage1 = listMin[k]; Ranage ranage2 = listMax[k]; if (ranage1.text != ranage2.text) //如果这个索引项中的内容不一样 { rangeWeightList[k]++; //那么权重加1 } } } } }
/// <summary> /// 初始化资源文件的模板范围文本的数字 /// </summary> private void initAssetsFileTargetRangeTextNumber(List <AssetFile> assetFileList, List <int> rangeWeightList) { //取得目标权重索引 int videoFileRangeIndex = this.getMaxWeightRangeIndex(rangeWeightList); //提取目标数字 for (int i = 0; i < assetFileList.Count; i++) { AssetFile assetFile = assetFileList[i]; int? targetRangeTextNumber = null;//不能识别的都放置在最后 if (assetFile.numberRanageList.Count > videoFileRangeIndex) { Ranage ranage = assetFile.numberRanageList[videoFileRangeIndex]; targetRangeTextNumber = Convert.ToInt32(ranage.text); } assetFile.targetRangeTextNumber = targetRangeTextNumber; } }
/// <summary> /// 收集资源文件数字范围 /// </summary> private void CollectAssetFileNumberRanage(List <AssetFile> assetFileList) { //收集文件中数字开始和结束的索引列表 for (int i = 0; i < assetFileList.Count; i++) { AssetFile assetFile = assetFileList[i]; Ranage ranage = null; string displayName = assetFile.displayName; List <Ranage> numberRanageList = assetFile.numberRanageList; numberRanageList.Clear(); for (int j = 0; j < displayName.Length; j++) { char c = displayName[j]; if (c >= '0' && c <= '9')//如果这个字符是数字 { if (ranage == null) { ranage = new Ranage(); ranage.assetFile = assetFile; ranage.start = j; } } else //如果这个字符不是数字 { if (ranage != null) { ranage.end = j; ranage.text = displayName.Substring(ranage.start, ranage.end - ranage.start); numberRanageList.Add(ranage); ranage = null; } } } } }
/// <summary> /// 匹配资源 /// </summary> private void DoMatchAsset() { assetMatchList.Clear(); for (int i = 0; i < this.videoFileList.Count; i++) { AssetFile videoAssetFile = this.videoFileList[i]; //先按照数字匹配 List <AssetFile> subtitleAssetFileList = null; int?numPtr = videoAssetFile.targetRangeTextNumber; //先按照数字匹配 if (numPtr.HasValue) { int num = numPtr.Value; subtitleAssetFileList = this.subtitleFileList.FindAll(x => x.targetRangeTextNumber == num); } if (subtitleAssetFileList == null || subtitleAssetFileList.Count == 0)//如果数字没有匹配项 { subtitleAssetFileList = new List <AssetFile>(); AssetFile templateAssetFile = this.videoFileList.Find(x => x.targetRangeTextNumber == 1); //至少有一个 1 吧,用它作为参照 if (templateAssetFile != null) //如果找到模板了 { int videoWeightRangeIndex = this.getMaxWeightRangeIndex(this.videoFileRangeWeightList); int subtitleWeightRangeIndex = this.getMaxWeightRangeIndex(this.subtitleFileRangeWeightList); Ranage videoRange = templateAssetFile.numberRanageList[videoWeightRangeIndex]; string str1 = videoAssetFile.fileName.Substring(videoRange.start, videoRange.length); for (int j = 0; j < this.subtitleFileList.Count; j++) { AssetFile subtitle = this.subtitleFileList[j]; Ranage subtitleRange = templateAssetFile.numberRanageList[videoWeightRangeIndex]; string str2 = subtitle.fileName.Substring(subtitleRange.start, subtitleRange.length); if (str2.Contains(str1)) { subtitleAssetFileList.Add(subtitle); } } } } //如果匹配成功才记录匹配数据 if (subtitleAssetFileList.Count > 0)//如果找到匹配项了 { AssetMatch assetMatch = new AssetMatch(); assetMatch.video = videoAssetFile; assetMatch.subtitleList = subtitleAssetFileList; //处理完全匹配 if (config.perfectMatch.enabled) //如果启用了完全匹配 { if (subtitleAssetFileList.Count > 1) //如果有多个匹配项 { this.DoPerfectMatch(assetMatch.video.displayNameSimplified, subtitleAssetFileList); } } //单匹配 和 多匹配处理 if (subtitleAssetFileList.Count == 1) //单匹配 { assetMatch.subtitle = subtitleAssetFileList[0]; //直接取得就行了 } else //多匹配 { int index; for (;;) { Console.WriteLine("视频:" + videoAssetFile.displayName); //排序 subtitleAssetFileList.Sort((x, y) => x.displayName.CompareTo(y.displayName)); //输出选项 for (int j = 0; j < subtitleAssetFileList.Count; j++) { Console.WriteLine("编号:{0} -> 字幕:{1}", j, subtitleAssetFileList[j].displayName); } Console.Write("视频出现同时多个字幕匹配,请选择目标字幕文件的编号:"); Console.Write("请输入您的选择,并按回车键确认,您的选择:"); string line = Console.ReadLine(); Console.WriteLine(); if (int.TryParse(line, out index)) { if (index < 0 || index > subtitleAssetFileList.Count) { Console.WriteLine("输出错误,请输入正确的编号!"); } else { assetMatch.subtitle = subtitleAssetFileList[index]; break; } } } } assetMatchList.Add(assetMatch); } } }