0

.srtファイルを読み取って画面に表示するC#アプリケーションに取り組んでいます。

ファイル形式は単純に次のようになります。

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に解析しようとしましたが、変換されませんでした。

何かアイデアはありますか?

4

3 に答える 3

1

TimeSpanタイプを使用して解析する必要があります。こちらをご覧ください

于 2012-05-18T04:02:47.467 に答える
1

DateTimeまたはTimeSpanのいずれかを使用できますが、機能するには正しい形式を指定する必要がありParseExactます。

于 2012-05-18T04:10:43.807 に答える
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; }
}
于 2012-05-18T04:51:40.293 に答える