/// <summary> /// 将当前字幕转化为参数类型的字幕 /// </summary> /// <param name="type">要转化的字幕类型</param> /// <param name="outPath">输出路径</param> /// <returns></returns> public virtual ReadSubtitles convertTo(uint type = SubtitlesType.Type_SRT, string outPath = "") { if (type == SubtitlesType.Type_Current) { if (this is ReadASS) { type = SubtitlesType.Type_ASS; } else { type = SubtitlesType.Type_SRT; } } ReadSubtitles rs = null; switch (type) { case 1: //srt rs = new ReadSRT(); rs.subtitlesUnits = new List <SubtitlesUnit>(); for (int i = 0; i < subtitlesUnits.Count; i++) { rs.subtitlesUnits.Add(new SRTUnit(subtitlesUnits[i])); } break; case 2: //ASS rs = new ReadASS(); (rs as ReadASS).StyleList.Add(new Styles()); (rs as ReadASS).ScriptInfomation = new ScriptInfo(); //rs.subtitlesUnits = new List<SubtitlesUnit>(); for (int i = 0; i < subtitlesUnits.Count; i++) { rs.subtitlesUnits.Add(new ASSUnit(subtitlesUnits[i])); } break; } if (outPath != "") { rs.writeSubtitles(outPath); } return(rs); }
/// <summary> /// 从指定路径读取字幕文件 /// </summary> /// <param name="path"></param> /// <returns></returns> public static ReadSubtitles ReadSubtitlesFromPath(string path) { if (!File.Exists(path)) { return(null); } ReadSubtitles rs = null; switch (Path.GetExtension(path).ToLower()) { case ".srt": rs = new ReadSRT(); break; case ".ass": rs = new ReadASS(); break; } if (rs != null) { rs.readSubtitles(path); } return(rs); }
/// <summary> /// 将当前字幕和参数中的字幕,按照时间进行合并,如果开始和结束时间相同,合并为同一个字幕元素,当前字幕在上方 /// </summary> /// <param name="subtitles">要参与合并的字幕</param> /// <param name="outPath">合并后字幕要输出的位置, 如果此值不为空,且为正确的路径,回自动写入合并后的字幕</param> /// <returns>合并后的字幕</returns> public ReadSubtitles mergeSubtitlesByTime(ReadSubtitles subtitles, uint type = SubtitlesType.Type_Current, string outPath = "") { ReadSRT rtn = new ReadSRT(); rtn.subtitlesUnits = new List <SubtitlesUnit>(); int lens1 = subtitlesUnits.Count; int lens2 = subtitles.subtitlesUnits.Count; rtn.fileInUrl = outPath == "" ? fileInUrl : outPath; SRTUnit tempUnit; int i = 0, j = 0; while (i < lens1 || j < lens2) { tempUnit = new SRTUnit(); if (i < lens1) { if (j < lens2) { if (subtitlesUnits[i].BeginTime == subtitles.subtitlesUnits[j].BeginTime && subtitlesUnits[i].EndTime == subtitles.subtitlesUnits[j].EndTime) { tempUnit.BeginTime = subtitlesUnits[i].BeginTime; tempUnit.EndTime = subtitlesUnits[i].EndTime; tempUnit.Contents.AddRange(subtitlesUnits[i].Contents); tempUnit.Contents.AddRange(subtitles.subtitlesUnits[j].Contents); i++; j++; } else if (subtitlesUnits[i].BeginTime < subtitles.subtitlesUnits[j].BeginTime) { tempUnit.BeginTime = subtitlesUnits[i].BeginTime; tempUnit.EndTime = subtitlesUnits[i].EndTime; tempUnit.Contents.AddRange(subtitlesUnits[i].Contents); i++; } else { tempUnit.BeginTime = subtitles.subtitlesUnits[j].BeginTime; tempUnit.EndTime = subtitles.subtitlesUnits[j].EndTime; tempUnit.Contents.AddRange(subtitles.subtitlesUnits[j].Contents); j++; } } else { tempUnit.BeginTime = subtitlesUnits[i].BeginTime; tempUnit.EndTime = subtitlesUnits[i].EndTime; tempUnit.Contents.AddRange(subtitlesUnits[i].Contents); i++; } } else { tempUnit.BeginTime = subtitles.subtitlesUnits[j].BeginTime; tempUnit.EndTime = subtitles.subtitlesUnits[j].EndTime; tempUnit.Contents.AddRange(subtitles.subtitlesUnits[j].Contents); j++; } rtn.subtitlesUnits.Add(tempUnit); } ReadSubtitles rs = this.convertTo(type); if (outPath != null && outPath.Length > 0) { rs.writeSubtitles(); } return(rs); }