• c++大作业 调整字幕的时间


    作业及其需求

    有时候人们能够下载一些感兴趣的视频但是发现并没有字幕,到字幕网站上查找到字幕文件,但是发现时间进度上不能完美配合,一个视频数据的例子来源于链接:
    BBC.巴塔哥尼亚:地球秘密乐园 https://www.aliyundrive.com/s/LmF2sgrQzMu/folder/612af030c6fa4bf4b7cf498d96acda7b9ef9258e
    相应的字幕文件来自于链接:
    https://so.zimuku.org/search?q=%E5%9C%B0%E7%90%83%E7%A7%98%E5%AF%86%E4%B9%90%E5%9B%AD&chost=zimuku.org
    上述视频和字幕文件在时间进度上不能完美匹配。
    字幕文件内容由以下示例段落组成,具体可下载文件后查看:
    1
    00:00:04,480 --> 00:00:07,120 
    In a far corner of the Earth 
    在地球的另一个角落

    2
    00:00:07,120 --> 00:00:10,560 
    is a South American wilderness.
    是南美洲的荒野.

    注意字幕文件的名字需要与对应的视频文件名一致,不包括扩展名。
    通常来说,各段字幕之间的间隔是准确的,如果有一个软件可以把字幕文件中的各个段落统一提前或推迟相同的时间,调整几次后就可以生成与视频进度完美匹配的字幕文件。
    设计一个类Subtitle代表一段字幕,其成员包括int id,两个时间类对象startTime和endTime(时间类应该有函数支持加减一个时间常量的运算),一个vect对象代表着一条或多条字幕内容(如果是双语则有两行字符串,单一语言则只有一行),一个类Video代表视频,Video中有一个指针pst指向系列Subtitle对象,有一个成员函数readSubtitle从文件中读取所有字幕,有一个函数adjustSubtitle调整所有字幕的时间点,有一个函数writeSubtitle将所有字幕内容定稿字幕文件。主函数中生成一个Video对象,通过该类的成员函数读取字幕文件、修改时间进度并将修改后的字幕内容保存以供测试。
    文件操作需要#include
    ifstream myfile("巴塔哥尼亚.E01.srt"); //打开文件读
    myfile >> myvar;  //可以像cin一样从文件中读数据到变量
    string s;
    getline(myfile, s); //从myfile中读取一整行到变量s
    myfile.close(); //同一文件只有关闭后才能再打开写
    //写文件
    ofstream outfile("巴塔哥尼亚.E01.srt"); //打开文件写
    和cout一样操作outfile,写完后close,就可以保存文件。

    函数writeSubtitle将所有字幕内容保存到字幕文件
    pst也可以考虑用vector更方便,每发现一个字幕,push_back到数组中

    思路及其代码实现

    我们首先要打开我们需要打开的文件

    我们首先来创建一个类Video和Subtitle来存储相应的数据,我们通过观察字幕的文件发现其文件的特征

    1. class Subtitle
    2. {
    3. private:
    4. int id;
    5. Time startTime, endTime;//字幕的开始时间和结束时间
    6. vector lines;//表示字幕的内容
    7. public:
    8. Subtitle(int id, const Time& start, const Time& end, const vector& lines)
    9. : id(id), startTime(start), endTime(end), lines(lines)
    10. {}
    11. void adjust(int ms)//调整字幕的开始时间和结束时间
    12. {
    13. startTime.adjust(ms);
    14. endTime.adjust(ms);
    15. }
    16. string toString() const//将字幕的信息转换为字符串格式
    17. {
    18. ostringstream oss;
    19. oss << id << "\n";
    20. oss << startTime.toString() << " --> " << endTime.toString() << "\n";//将字幕的开始时间和结束时间输出到oss中
    21. for (const string& line : lines)//历字幕的每一行,将其输出到 oss 中,然后输出一个换行符。
    22. {
    23. oss << line << "\n";
    24. }
    25. oss << "\n";
    26. return oss.str();//将oss中的数据转换为字符串,并返回
    27. }
    28. };
    29. bool isNumber(const string& str)
    30. {
    31. return !str.empty() && all_of(str.begin(), str.end(),
    32. [](unsigned char c)//C++ 的 all_of 算法,检查 str 中的所有字符。接受一个字符 c,并检查 c 是否是数字。
    33. { return ::isdigit(c); });//isdigit用于检查一个字符是否是数字
    34. }
    35. class Video
    36. {
    37. private:
    38. string subtitleFile;
    39. vector subtitles;//存储多个时间加后面的字幕
    40. void readSubtitles()//从字幕文件中读取字幕
    41. {
    42. //判断是否打开
    43. ifstream infile(subtitleFile);
    44. if (!inf
  • 相关阅读:
    chatgpt赋能python:Python请求头——让你的网络请求更有效率
    基于springboot实现企业客户信息反馈平台管理系统项目【项目源码+论文说明】计算机毕业设计
    计算机基础知识52
    gin架构下实现页面的数据调用
    2022/11/2 springboot整合mongodb
    【牛客刷题-算法】1-算法入门-数据结构-栈
    stm32编写Modbus步骤
    【超快捷】Windows系统自带的快捷键合集
    pytorch nn.utils.rnn.pack_padded_sequence 分析
    【斗罗二】霍雨浩迷惑审查,戴华斌故意挑衅,惨败者屈服下跪
  • 原文地址:https://blog.csdn.net/2302_79128004/article/details/139221766