Személyes eszközök
Keresés

 

A InfoWiki wikiből

.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;
 
}
Hernyák Zoltán
A lap eredeti címe: „http://wiki.ektf.hu/wiki/Cs:Subtitle
Nézetek
nincs sb_3.228.10.34 cikk