0

我需要字幕方面的帮助 =)

我有两个带字幕的 .srt 文件。一个是英语,另一个是斯洛文尼亚语。问题是斯洛文尼亚语的文件没有正确的时间码,所以字幕比实际行快。我想要做的是编写一个程序来读取这两个文件,从 eng.srt 文件中获取字幕的数量和时间码以及从slo.srt文件中的字幕,并将所有内容写入complete.srt。我不在乎它是用 Java 还是 C 语言。我目前正在尝试用 C 语言编写程序,我会寻求任何帮助。

现在来演示一下我想要做什么:

eng.srt (right timecode)

1
00:00:01,259 --> 00:00:03,734
<i>Previously on...</i>

2
00:00:03,746 --> 00:00:06,910
<i>Tom and Lynette drifted further apart,</i>

3
00:00:06,911 --> 00:00:09,275
<i>and Jane took advantage.</i>

4
00:00:09,440 --> 00:00:10,670
I'm scared.

5
00:00:10,671 --> 00:00:13,362
<i>Roy helped Karen face her cancer.</i>




slo.srt (right subtitles)

1
00:00:00,009 --> 00:00:02,484
<i>Prejšnič...</i>

2
00:00:02,496 --> 00:00:05,660
<i>Tom and Lynette
sta se še bolj odtujila,</i>

3
00:00:05,661 --> 00:00:08,025
<i>in Jane je to izkoristila.</i>

4
00:00:08,190 --> 00:00:09,420
Strah me je.

5
00:00:09,421 --> 00:00:12,112
<i>Roy se je pomagal Karen
soočiti z rakom.</i>



complete.srt (where i write)

1
00:00:01,259 --> 00:00:03,734
<i>Prejšnič...</i>

2
00:00:03,746 --> 00:00:06,910
<i>Tom and Lynette
sta se še bolj odtujila,</i>
...

这是我到目前为止所拥有的(我打开 3 个文件,我将随时更新我的​​工作):

#include <stdio.h>
#include <stdlib.h>

int main()
{
   char ch, sf1[20], sf2[20], tf[20];
   FILE *source1, *source2, *target;

   //first source file
   printf("Enter name of first source file\n");
   gets(sf1);

   source1 = fopen(sf1, "r");

   //seconds source file
   printf("Enter name of second source file\n");
   gets(sf2);

   source2 = fopen(sf2, "r");

   if( source == NULL )
   {
      printf("Press any key to exit...\n");
      exit(EXIT_FAILURE);
   }

   //target file
   printf("Enter name of target file\n");
   gets(tf);

   target = fopen(tf, "w");

   if( target == NULL )
   {
      fclose(source);
      printf("Press any key to exit...\n");
      exit(EXIT_FAILURE);
   }




   printf("File writen successfully.\n");

   fclose(source1);
   fclose(source2);
   fclose(target);

   return 0;
}

我的问题是我不知道如何告诉程序只读取eng.srt文件中的数字,而不是跳过字幕部分并等待,而不是读取slo.srt 文件取出字幕并跳过数字。

4

2 回答 2

0

这通过 awk 等模式匹配语言更容易完成。这里的模式非常简单。对于时间码,它以 2 位数字 (^[0-9][0-9]) 开头,字幕以 (^) 开头。我没有详细说明解决方案,因为我不知道您是否会使用其中一种脚本语言。

于 2013-10-20T15:30:21.637 回答
0

主要逻辑很简单。这是pseudo-code它。

for each subtitle in file1 and file2:
    extract_time_from_file1;
    extract_subtitle_from_file2;
    write_into_new_file_combining_the_time_and_string

这是一个完整的工作代码:

#include <iostream>
#include <fstream>
using namespace std;
string read_title_string(ifstream& in)
{
    string ans="";
    string tmp;
    getline(in, tmp);//neglect the subtitle number
    getline(in, tmp);//neglect the time..
    /*sub-title extraction*/
    while(1)//read until the blank line and store all the strings..
    {
     getline(in, tmp);
     if(tmp.length()==0)
        break;
    ans += tmp;
    }
    return ans;
}
string read_title_time(ifstream& in)
{
    string ans="";
    string tmp;
    getline(in, tmp);//ignore subtitle number..
    getline(in, ans);//this is what we want..
    while(1)//read until a blank line and ignore them..
    {
        getline(in, tmp);
        if(tmp.length()==0)
            break;
    }
    return ans;
}
int main()
{
    ifstream ins("slo.srt"),outs("eng.srt");
    ofstream ans("complete.srt");
    int count=1;
    while(!ins.eof() && !outs.eof())
    {
        ans<<count++<<endl;
        ans<<read_title_time(outs)<<endl;
        ans<<read_title_string(ins)<<endl;
        ans<<endl;
    }
    ins.close();outs.close();ans.close();
    return 0;
}

请注意,此代码依赖于文件的结构。如果内容以不同的方式组织,这可能不起作用。希望这可以帮助!!

于 2013-10-20T15:34:59.847 回答