A InfoWiki wikiből
A lap korábbi változatát látod, amilyen Aroan (vita | szerkesztései) 2009. január 10., 14:23-kor történt szerkesztése után volt.
.srt felirat file beolvasása
Az angol nyelvű filmekhez gyakran lehet felirat (subtitle) file-okat találni, melyek vagy .sub vagy .srt file-okban léteznek. A két file belső szerkezete eltérő, most az .srt file-okkal foglalkozunk.
Kell egy rekord szerkezet, amely egy .srt bejegyzést tartalmaz. Ez áll a megjelenítendő felirat sorokból (lines), a megjelenítés kezdő és záró időpontjából:
class rekord { public DateTime kezdo; public DateTime zaro; public List<string> lines = new List<string>(); public static List<rekord> lista = new List<rekord>(); }
A beolvasó kód az alábbi:
using System.IO; using System.Globalization; static void Main(string[] args) { StreamReader srt = new StreamReader(@"C:\film.srt", Encoding.Default); rekord r = null; bool emptyLine = true; while (!srt.EndOfStream) { string s = srt.ReadLine().Trim(); int x; if (Int32.TryParse(s, out x) && emptyLine) { r = new rekord(); emptyLine = false; continue; } if (s.IndexOf("-->") > 0) { setKezdoVeg(s, r); continue; } if (s.Length > 0) { r.lines.Add(s); if (r.lines.Count == 1) rekord.lista.Add(r); } else emptyLine = true; } srt.Close(); }
Az időpontokat "01:12:32,345 --> 01:12:33,544" alakban adják meg, ez jelenti hogy mettól meddig kell a feliratnak a képernyőn lennie:
static void setKezdoVeg(string s, rekord r) { string[] ss = s.Split(new string[] {"-->"}, StringSplitOptions.RemoveEmptyEntries); r.kezdo = getTimeStamp(ss[0].Trim()); r.zaro = getTimeStamp(ss[1].Trim()); }
Ezen függvény egyetlen időpont-leírást alakít DateTime alakúra. Az időpont leírás pl "01:12:32,345" alakú, ez azt jelenti, hogy 1 óra 12 perc 32 másodperc, 345 ezredmásodperc:
static IFormatProvider format = new CultureInfo("en-US", true); static DateTime getTimeStamp(string s) { string[] ss = s.Split(':'); DateTime d; int ora = int.Parse(ss[0]); int perc = int.Parse(ss[1]); double masodperc = double.Parse(ss[2].Replace(',', '.'), format); double ticks = (ora * 3600 + perc * 60 + masodperc) * 10000000; d = new DateTime( (long)ticks); return d; }