【问题标题】:How to modify only timecodes but not other numbers or letters in a text file?如何只修改时间码而不修改文本文件中的其他数字或字母?
【发布时间】:2023-03-05 10:28:01
【问题描述】:

我正在制作一个程序来加速和减慢部分视频,我想支持修改字幕的时间以匹配。如何仅搜索文本文件中的时间码并进行修改?

这适用于 srt 字幕文件。时间码的格式为HH.MM.SS,mmm。这些文件包含其他数字(例如十六进制颜色),所以我只想搜索特定时间码格式的数字。

我已经有一个以秒为单位的输入时间并以秒为单位返回输出时间的函数。在“时间码”格式和时间(以秒为单位)之间进行转换也应该相当容易。

这是一个文本文件的例子:

1
00:00:00,000 --> 00:00:09,138
<font color="#CCCCCC">alexxa</font><font color="#E5E5E5"> who's your favorite president</font>

2
00:00:04,759 --> 00:00:12,889
<font color="#E5E5E5">George Washington</font><font color="#CCCCCC"> has my vote Alexa</font>

剩下的就是如何只接收时间码,然后用新的时间码替换它们? 不知道从这里去哪里。最好避免不必要地循环遍历文本文件,因为会有很多时间码需要更改。

【问题讨论】:

  • 虽然如果被替换的字符与原始字符完全相同,您可以就地修改文件——但最好避免这种情况,因为它很脆弱。最好将文件读入内存进行更改并写出新文件。

标签: c++ file-io subtitle


【解决方案1】:

鉴于它是一种文本格式,匹配(和替换)文件中时间戳格式的最有效方法是使用正则表达式:https://en.cppreference.com/w/cpp/regex

算法你想要这样:你从源文件中逐行读取,因为 RE 匹配的每个读取行,用新的时间戳替换它(即制作新行)并输出到新文件(或缓冲区,稍后可以将其提交到源文件中 - 处理完成后) .其他行(RE 不匹配的地方)你输出原样,因为它们是被读取的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2018-05-20
    • 2013-05-15
    • 2014-07-21
    相关资源
    最近更新 更多