SRT字幕时间拼接

本文详细介绍了如何正确拼接SRT字幕文件的时间码,确保字幕与视频内容同步。通过理解SRT格式的时间结构,学习在编辑过程中如何避免常见的同步问题,提升字幕制作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import re
from mutagen.mp3 import MP3





def get_extention(my_fn):
    '''
    my_fn='E:\\0000\\hgf\\2018-1.2-14_105614.png'
    '''
    str_split=my_fn.split('\\')

    if '\\' in my_fn: #如果含有'\\',则必有文件夹名,找到最后一个'\\'的索引
        n=0
        for i in my_fn:
            if i=='\\':
                dash_index=n
            n+=1
        mid0=my_fn[0:dash_index+1]
        mid12=my_fn[dash_index+1:]

        if '.' in mid12: #如果mid12含有'.',找到最后一个'.'的索引
            n=0
            for i in mid12:
                if i=='.':
                    spot_index=n
                n+=1
            mid1=mid12[0:spot_index]
            mid2=mid12[spot_index:]
        else:#没有'.',则文件名无后缀名
            mid1=mid12
            mid2=''

    else:#没有'\\',则只是文件名,找到最后一个'\\'的索引
        mid0=''
        mid12=my_fn

        if '.' in mid12: #如果mid12含有'.',找到最后一个'.'的索引
            n=0
            for i in mid12:
                #print(i)
                if i=='.':
                    spot_index=n
                n+=1
            mid1=mid12[0:spot_index]
            mid2=mid12[spot_index:]
        else:#没有'.',则文件名无后缀名
            mid1=mid12
            mid2=''

    return(mid0,mid1,mid2)






class SrtConcator(object):
    '''
    # 根据转码后的MP3文件对SRT进行时长拼接,消除时间积累误差
    
    Usage:

    SrtList = [
    'D1T01 - Wuthering Heights.srt', 
    'D1T02 - Wuthering Heights.srt', 
    'D1T03 - Wuthering Heights.srt', 
    'D1T04 - Wuthering Heights.srt', 
    'D1T05 - Wuthering Heights.srt', 
    'D1T06 - Wuthering Heights.srt', 
    'D1T07 - Wuthering Heights.srt', 
    ]
    A = SrtConcator(SrtList=SrtList, ConvertedMp3Folder='mp3_converted\\')
    A.concat('out.srt')


    '''
    def __init__(self, SrtList, ConvertedMp3Folder):
        self.SrtList = SrtList
        self.ConvertedMp3Folder = ConvertedMp3Folder
        self.SRT_to_MP3 = []
        self.SRT_no_MP3 = []

        # 根据所提供的SrtList检查是否存在对应的MP3文件,查找不到则抛出异常
        for srt in SrtList:
            ttt = get_extention(srt)
            mp3 = f'{self.ConvertedMp3Folder}{ttt[1]}.mp3'
            print(mp3)
            if exists(mp3):
                self.SRT_to_MP3.append((srt, mp3))
            else: # 找不到对应的MP3
                self.SRT_no_MP3.append(srt)



    def floatseconds2srthms(self, floatseconds=361.123): #秒转化为时分秒 返回Unicode
        ### print [floatseconds2hms(floatseconds=361.123)] [u'00:06:01.123']
        if floatseconds/3600>=1: #若满一个小时
            hours=int(floatseconds/3600) #取整数部分 小时数
            yu_1=floatseconds%3600  #余下的秒数
            if yu_1/60>=1:  #余下的秒数若满一分钟
                minutes=int(yu_1/60) #取整数部分 分钟数
                floatseconds=yu_1%60
            else: #余下的秒数若不满一分钟
                minutes=0
                floatseconds=yu_1
        else: #未满一个小时
            hours=0
            if floatseconds/60>=1:  #若满一分钟
                minutes=int(floatseconds/60) #取整数部分 分钟数
                floatseconds=floatseconds%60
            else: #未满一分钟
                minutes=0
                floatseconds=floatseconds

        floatseconds_ = round(floatseconds,3)
        seconds = int(floatseconds_)
        milliseconds = int((floatseconds_ - seconds)*1000)

        return f'{hours:0=2}:{minutes:0=2}:{seconds:0=2},{milliseconds:0=3}'



    def srthms2floatseconds(self, srthms='02:03:20,235'):
        l=re.findall(r'([0-9]{2}):([0-9]{2}):([0-9]{2},[0-9]{3})', srthms)
        h = float(l[0][0])
        m = float(l[0][1])
        s = float(l[0][2].replace(',','.'))
        floatseconds = h*3600 + m*60 + s
        return floatseconds


    def createSRTdata(self, srt='01-A Puma at Large.srt'):
        with open(srt,'r', encoding='utf8') as f:
            print([srt])
            data_list = f.readlines()

        key_l = []
        n = 0
        for i in data_list:
            if '-->' in i:
                key_l.append(n)
            n+=1

        srt_data = []
        for i in key_l:
            key = data_list[i]
            content = data_list[i+1]
            #print(key)
            k = key.split(' --> ')
            time_t = (self.srthms2floatseconds(srthms=k[0]), self.srthms2floatseconds(srthms=k[1]))
            #print(k, time_t)
            #print(content)
            #print('==========')
            item = [time_t, content]
            #print(item)
            srt_data.append(item)
        return srt_data

    def concat(self, srtFileName):
        # 根据转码后的MP3文件对SRT进行时长拼接,消除积累误差
        mp3__length__srt = []
        for tt in self.SRT_to_MP3:
            mp3 = tt[1]
            #print([mp3])
            length = MP3(mp3).info.length
            srt = tt[0]
            #print([length])
            mp3__length__srt.append((mp3, length, srt))

        #print(mp3__length__srt)

        srt_data_new = []
        n = 0
        duration = 0.000
        for ttt in mp3__length__srt:
            print(duration, n)
            mp3 = ttt[0]
            length = ttt[1]
            srt = ttt[2]
            print([srt])
            srt_data = self.createSRTdata(srt)
            print(srt_data)
            for j in srt_data:
                #print(j)
                new_t = (j[0][0]+duration, j[0][1]+duration)
                new_t_srt = (self.floatseconds2srthms(floatseconds=new_t[0]), self.floatseconds2srthms(floatseconds=new_t[1]))#
                k = [new_t_srt, j[1]]
                #print(k,'\n')
                srt_data_new.append(k)
            
            print(f'== done ==>{srt}\n\n\n')
            
            duration = duration + length
            n += 1
        print(srt_data_new)


        f = open(srtFileName, 'w', encoding='utf8')
        n = 1
        for i in srt_data_new:
            #print(i)
            #print(i[0][1])
            start = i[0][0]
            end = i[0][1]
            f.write(f'{n}\n')
            f.write(f'{start} --> {end}\n')
            f.write(i[1])
            f.write('\n')
            n += 1
        f.close()










### 关于 UniApp 框架推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值