python 实现 PC端剪映字幕转换SRT格式工具代码-Python 实现

该代码实现了一个从剪映字幕文件中读取并转换字幕内容和时间的功能。它读取json文件,获取字幕内容和时间信息,然后合并两者生成srt格式的字幕文件。主要涉及文件操作、时间处理和字典操作。

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

#encoding:utf-8
import json
import time
import datetime
import os
import socket
import getpass

user_name = getpass.getuser() # 获取当前用户名
hostname = socket.gethostname() # 获取当前主机名

def readjson():
    """
    读取字幕文本
    :return:
    """
    with open(readfiles(),'r',encoding='utf-8') as load_f:
        load_dict = json.load(load_f)
        return load_dict

def get_content():
    """
    获取字幕内容
    :return:
    """
    materials = readjson()['materials']
    texts = materials['texts']
    content = {}
    for tt in texts:
        textId = tt['id']
        text_content = tt['content']
        text_dict = {textId:text_content}
        content.update(text_dict)

    return content

def get_tracks():
    """
    获取时间
    :return:
    """
    tracks = readjson()['tracks']
    durations_dict = {}
    for tk in tracks:
        flag = tk['flag']
        if str(flag) == '1':
            segments = tk['segments']
            for s in segments:
                material_id = s['material_id']
                target_timerange = s['target_timerange']
                duration = {material_id:target_timerange}
                durations_dict.update(duration)

    return durations_dict


def merger_content():
    """
    把时间与字幕内容合并
    :return:
    """
    content = get_content()
    duration_time = get_tracks()

    subtitle = []

    for k,v in content.items():

        durationinfo = duration_time[k]
        duration = int(durationinfo['duration']) # 字幕片段时长时间
        start = int(durationinfo['start'])/1000000 # 字幕片段开始时间
        statrTime = datetime.timedelta(seconds=start) #转换成时间格式
        endduration = (int(int(durationinfo['duration'])) + int(durationinfo['start']))/1000000
        endTime = datetime.timedelta(seconds=endduration)
        duration_list = [str(statrTime),str(endTime)]
        t = [v] + duration_list
        subtitle.append(t)

    return subtitle


def run():
    """
    执行函数
    :return:
    """
    t = "*********************** 剪映字幕转换器 ***********************"
    print(t)
    print("")
    filename = input("请输入字幕文件名称:")
    filefolder = f'data/{filename}'
    createFolder(filefolder)

    timeName = time.time()
    time_array = time.localtime(timeName)
    str_date = time.strftime("%Y%m%d%H%M%S", time_array)
    newfilename = f"{filename}_{str_date}"
    savepath = os.path.join(filefolder,newfilename)

    content = merger_content()
    n = 0
    for ct in content:
        n += 1
        content_text = ct[0]
        start_duration = timeFormat(str(ct[1]).replace('.',','))
        end_duration = timeFormat(str(ct[-1]).replace('.',','))
        text_duration = f"{start_duration} --> {end_duration}"
        text_n = ""
        writefile(savepath, n)
        writefile(savepath, text_duration)
        writefile(savepath, content_text)
        writefile(savepath, text_n)

    print("")
    input(f"{filename}字幕 生成成功[回车结束]:")


def timeFormat(t):

    h = t.split(':')[0]
    m = t.split(':')[1]
    s = t.split(':')[-1][0:6]

    if len(h) == 1 :
        timeT = ["0"+str(h)] + [m] + [s]
        timeT = ":".join(timeT)
        return timeT
    if len(h) == 2:
        timeT = [h] + [m] + [s]
        timeT = ":".join(timeT)
        return timeT

def writefile(filename,content):

    with open(f'{filename}.srt','a+',encoding='utf-8') as f:
        f.write(str(content)+'\n')
        f.close()
        print(f"successful write:{content}")

def readfiles():

    path = fr"C:\Users\{user_name}\AppData\Local\JianyingPro\User Data\Projects\com.lveditor.draft"

    path = new_report(path)
    file = os.listdir(path)
    draft_content = [x for x in file if 'draft_content.json' == x][0]
    subtitle_path = os.path.join(path, draft_content)
    print("读取到 剪映字幕文件")
    return subtitle_path


def new_report(test_report):
    """
    读取文件,并返回最新的目录(文件夹)路径
    :param test_report:
    :return:
    """
    file = os.listdir(test_report)  # 列出目录的下所有文件和文件夹保存到lists

    folderlist = []
    tdict = {}

    for f in file:
        filepath = os.path.join(test_report, f)
        if os.path.isdir(filepath) == True:
            folderlist.append(str(f))
            ctime = time.ctime(os.path.getctime(filepath))
            s = int(time.mktime(time.strptime(ctime,"%a %b %d %H:%M:%S %Y")))
            t = {s:f}
            tdict.update(t)

    max_time = max(list(tdict.keys()))
    new_filepath = os.path.join(test_report, tdict[max_time])
    return new_filepath


def createFolder(path):

    while True:
        if os.path.isdir(path):
            break
        else:
            os.makedirs(path)

if __name__ == '__main__':
    run()

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋哈哈呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值