关于vtt 与 srt 字幕 的相互转换

本文介绍了一个使用Python编写的脚本,用于将VTT字幕文件批量转换为SRT格式,或者反之。脚本通过删除VTT文件的WEBVTT标识符并替换时间戳中的'.'为','来实现转换。同时提供了转换函数的详细代码。" 136643445,161309,使用epoll()构建高性能TCP服务器,"['网络编程', 'TCP/IP', '服务器', 'epoll', 'Linux']

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

我在下载的udacity中教程时,字幕和视频是分离的,对于英文还无法完全听懂的我来说,字幕还是比较重要.不想看解释的可直接跳到最后复制代码运行即可.

 

查看了vtt和srt的区别,使用记事本打开vtt和srt,发现主要有两个

 

  1. 首行多了 WEBVTT\n\n 标识符
  2. 标点格式区别,vtt内部的"."在srt中为","

流程图:

 

 

基于python写了一个简单的脚本对其进行批量修改

 

  • 1 引入依赖
    1. os获取文件信息
    2. sys获取命令行输入args
    3. re对获取的文件内容进行匹配或更换
import os
import sys
import re
  • 2 定义主函数 
  • if __name__ == '__main__':
        args = sys.argv
        print(args)
    
        if os.path.isdir(args[1]):
            file_list = get_file_name(args[1], ".vtt")
            for file in file_list:
                vtt2srt(file)
    
        elif os.path.isfile(args[1]):
            vtt2srt(args[1])
        else:
            print("arg[0] should be file name or dir")

     

  • 3 定义获取文件名称函数get_file_name
  • def get_file_name(dir, file_extension):
        f_list = os.listdir(dir)
    
        result_list = []
    
        for file_name in f_list:
            if os.path.splitext(file_name)[1] == file_extension:
                result_list.append(os.path.join(dir, file_name))
        return result_list

     

  • 4 定义转换逻辑
  • def vtt2srt(file_name):
        content = open(file_name, "r", encoding="utf-8").read()
        # 删除WEBVTT行
        
        content = re.sub("WEBVTT\n\n",'',content)
        # 替换“.”为“,”
        content = re.sub("(\d{2}:\d{2}:\d{2}).(\d{3})", lambda m: m.group(1) + ',' + m.group(2), content)
    
        output_file = os.path.splitext(file_name)[0] + '.srt'
        open(output_file, "w", encoding="utf-8").write(content)
    
    def srt2vtt(file_name):
        content = open(file_name, "r", encoding="utf-8").read()
        # 添加WEBVTT行
        
        content = "WEBVTT\n\n" + content
        # 替换“,”为“.”
        content = re.sub("(\d{2}:\d{2}:\d{2}),(\d{3})", lambda m: m.group(1) + '.' + m.group(2), content)
    
        output_file = os.path.splitext(file_name)[0] + '.vtt'
        open(output_file, "w", encoding="utf-8").write(content)

     

  • 5 完整代码
  • import os
    import sys
    import re
    
    
    def get_file_name(dir, file_extension):
        f_list = os.listdir(dir)
    
        result_list = []
    
        for file_name in f_list:
            if os.path.splitext(file_name)[1] == file_extension:
                result_list.append(os.path.join(dir, file_name))
        return result_list
    
    
    def vtt2srt(file_name):
        content = open(file_name, "r", encoding="utf-8").read()
        # 删除WEBVTT行
        
        content = re.sub("WEBVTT\n\n",'',content)
        # 替换“.”为“,”
        content = re.sub("(\d{2}:\d{2}:\d{2}).(\d{3})", lambda m: m.group(1) + ',' + m.group(2), content)
    
        output_file = os.path.splitext(file_name)[0] + '.srt'
        open(output_file, "w", encoding="utf-8").write(content)
    
    def srt2vtt(file_name):
        content = open(file_name, "r", encoding="utf-8").read()
        # 添加WEBVTT行
        
        content = "WEBVTT\n\n" + content
        # 替换“,”为“.”
        content = re.sub("(\d{2}:\d{2}:\d{2}),(\d{3})", lambda m: m.group(1) + '.' + m.group(2), content)
    
        output_file = os.path.splitext(file_name)[0] + '.vtt'
        open(output_file, "w", encoding="utf-8").write(content)
    
        
    if __name__ == '__main__':
        args = sys.argv
    
        if os.path.isdir(args[1]):
            file_list = get_file_name(args[1], ".vtt")
            for file in file_list:
                vtt2srt(file)
    
        elif os.path.isfile(args[1]):
            vtt2srt(args[1])
            print('done')
        else:
            print("arg[0] should be file name or dir")
    View Code

    注意:

    • 1 为避免路径错误,请使用文件夹的绝对路径

    • 代码基于python3.x

 

转载于:https://www.cnblogs.com/BigJ/p/vtt_srt.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值