コード例 #1
0
    /// <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
                    }
                }
            }
        }
    }
コード例 #2
0
    /// <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;
        }
    }
コード例 #3
0
    /// <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;
                    }
                }
            }
        }
    }
コード例 #4
0
    /// <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);
            }
        }
    }