2012-05-18 30 views
0

我正在研究C#應用程序,它將讀取.srt文件並將其顯示在屏幕上。什麼是字幕(.srt)時間框架的類型?

文件格式就是這樣;

1 00:00:06,000 00:00:07,400 Enjoy the movie! 
2 00:00:07,500 00:00:09,500 Hi, my name is Mary 
3 00:00:22,000 00:00:25,000 Hello my name is John. 

我使用的是每100毫秒滴答一個計時器,並在每一個刻度我 要檢查,如果值是起點和終點之間。在這種情況下,首先將在 00:00:06,000和00:00:07,400之間。但我不確定我應該使用什麼樣的價值。我試圖解析它到DateTime但它沒有轉換。

有什麼想法嗎?

回答

1

您可以選擇使用類型時間跨度看看here

+0

我試圖 '時間跨度firstTime = TimeSpan.Parse( 「00:00:0.6」);' ,但沒有奏效。任何想法? –

+0

因爲您在毫秒之前使用逗號,因爲文檔說它應該是這樣一個點:firstTime = TimeSpan.Parse(「00:00:06.000」); –

+0

謝謝,效果很好。 –

1

使用TimeSpan。 這裏簡單的控制檯項目顯示字幕在正確的時間

class Program 
    { 
    private static Queue<Subtitle> _subtitles; 

    private static Subtitle _activeSubtitle; 

    private static TimeSpan _currentTime = new TimeSpan(); 

    static void Main(string[] args) 
    { 
     _subtitles = new Queue<Subtitle>(); 

     Subtitle title1 = new Subtitle() 
           { 
            StartTime = TimeSpan.Parse("00:00:06,000"), 
            EndTime = TimeSpan.Parse("00:00:07,400"), 
            Text = "Enjoy the movie!" 
           }; 

     Subtitle title2 = new Subtitle() 
           { 
            StartTime = TimeSpan.Parse("00:00:07,500"), 
            EndTime = TimeSpan.Parse("00:00:09,500"), 
            Text = "Hi, my name is Mary" 
           }; 

     Subtitle title3 = new Subtitle() 
           { 
            StartTime = TimeSpan.Parse("00:00:22,000"), 
            EndTime = TimeSpan.Parse("00:00:25,000"), 
            Text = "Hello my name is John." 
           }; 

     _subtitles.Enqueue(title1); 
     _subtitles.Enqueue(title2); 
     _subtitles.Enqueue(title3); 

     Timer timer = new Timer(ShowSubtitles, null, 0, 100); 

     while (_currentTime <= new TimeSpan(0, 0, 0, 30)) 
     { 

     } 
     Console.WriteLine("End"); 
    } 

    private static void ShowSubtitles(object state) 
    { 

     if (_activeSubtitle == null && _subtitles.Count > 0) 
      _activeSubtitle = _subtitles.Dequeue(); 
     Console.WriteLine(_currentTime); 

     if (_activeSubtitle != null) 
     { 


      if (_currentTime >= _activeSubtitle.StartTime && _currentTime <= _activeSubtitle.EndTime) 
       Console.WriteLine("\t{0}", _activeSubtitle.Text); 

      if (_currentTime >= _activeSubtitle.EndTime) 
       _activeSubtitle = null; 
     } 
     _currentTime = _currentTime.Add(new TimeSpan(0, 0, 0, 0, 100)); 

    } 
} 

internal class Subtitle 
{ 
    public TimeSpan StartTime { get; set; } 
    public TimeSpan EndTime { get; set; } 
    public string Text { get; set; } 
}