2012-10-12 23 views
6

उपशीर्षक समय को आगे और पीछे कैसे बदलें/बदलें? उपशीर्षक समय प्रारूप इस तरह दिखता है: 00:00:52,656 --> 00:00:56,326SRT (SubRip) फ़ाइलों में उपशीर्षक समय को सही/स्थानांतरित करने के लिए कैसे करें?

उपशीर्षक और ऑडियो सिंक्रनाइज़ नहीं कर रहे हैं, उदाहरण के लिए, उपशीर्षक अप करने से पहले आवाज़/ऑडियो से पता चलता है, तो उपशीर्षक लाइनों के हर समय (समय प्रारूप: 00:00:52,656 --> 00:00:56,326) सही किया जाना चाहिए।

तो, यदि सभी उपशीर्षक लाइनों का समय बदला जाना चाहिए/2 सेकंड के लिए स्थानांतरित किया जाना चाहिए। आगे, फिर, इस बार उपशीर्षक रेखा के लिए: 00:00:52,656 --> 00:00:56,326 को बदला जाना चाहिए: 00:00:54,656 --> 00:00:58,326

और यह उपशीर्षक फ़ाइल में हर बार संदर्भित करता है, न केवल टेक्स्ट/एक बार की एक पंक्ति।


कैसे सबरिप (.srt) फ़ाइल की तरह दिखता है का उदाहरण:

1 
00:00:52,656 --> 00:00:56,326 
Kanalska Zona: Panama 

2 
00:00:56,335 --> 00:00:59,755 
Francuzi su pokušali da izgrade 
kanal pre Amerikanaca. 
+4

कार्य के किस भाग में आपको समस्या है? क्या यह वास्तव में उपशीर्षक के लिए विशिष्ट है, या यह वास्तव में * किसी * समय के बारे में व्यक्त किया गया है? क्या, विशेष रूप से, क्या आप "शिफ्ट" करना चाहते हैं? समय को "स्थानांतरित करने" का क्या अर्थ है? समय बदलने पर, आपके अपेक्षित आउटपुट क्या हैं? –

+0

मुझे खेद है कि मेरा प्रश्न स्पष्ट नहीं था। यह संपादित किया गया है और मुझे लगता है कि अब स्पष्ट है। –

+2

अच्छा। धन्यवाद। लेकिन फिर, आप किस हिस्से में परेशानी कर रहे हैं? ऐसा लगता है कि आप पहले से ही समस्या को समझते हैं। –

उत्तर

7

प्रदान करना है कि अपने इनपुट में प्रत्येक पंक्ति का स्वरूप हमेशा 00:00:00,000 --> 00:00:00,000 है, तो यह नियमित TDateTime को स्ट्रिंग बार में परिवर्तित कर देंगे , जोड़ सकते हैं या बदलाव घटाना, और रेखा को फिर से लिखने:

procedure ShiftSubtitleTimes(Lines: TStrings; Diff: TTime); 
var 
    FS: TFormatSettings; 
    I: Integer; 
    T1: TDateTime; 
    T2: TDateTime; 
begin 
    // Ensure using the correct time separator 
    FS.TimeSeparator := ':'; 
    // Parse each line separately 
    for I := 0 to Lines.Count - 1 do 
    begin 
    // Convert the two time strings to time values 
    if not TryStrToTime(Copy(Lines[I], 1, 8), T1, FS) then 
     // But skip line in case of wrong format 
     Continue; 
    T1 := T1 + StrToInt(Copy(Lines[I], 10, 3))/MSecsPerDay; 
    T2 := StrToTime(Copy(Lines[I], 18, 8), FS); 
    T2 := T2 + StrToInt(Copy(Lines[I], 27, 3))/MSecsPerDay; 
    // Add the shift 
    T1 := T1 + Diff; 
    T2 := T2 + Diff; 
    // Rewrite the line 
    Lines[I] := FormatDateTime('hh:nn:ss,zzz --> ', T1, FS) + 
     FormatDateTime('hh:nn:ss,zzz', T2, FS); 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    List: TStringList; 
begin 
    List := TStringList.Create; 
    try 
    List.LoadFromFile('Filename.dat'); 
    Memo1.Lines.Add('Input:'); 
    Memo1.Lines.AddStrings(List); 
    Memo1.Lines.Add(''); 
    // Shift 3,5 seconds backwards: 
    ShiftSubtitleTimes(List, -3.5/SecsPerDay); 
    Memo1.Lines.Add('Output:'); 
    Memo1.Lines.AddStrings(List); 
    finally 
    List.Free; 
    end; 
end; 

enter image description here

संपादित करें:

अपने संपादित के कारण, अब इनपुट हो सकती है 'गलत' लाइनों है कि कोई रूपांतरण भी जरूरत है।