批量合成bilibili的m4s缓存文件为MP4格式 ver2.0

之前的版本:链接:批量合成bilibili的m4s缓存文件为MP4格式 v1.0

批量合成bilibili的m4s缓存文件为MP4格式 ver2.0


相对之前版本更新内容:


※ 支持识别番剧进行合成。

※ 无json文件也可进行合成(不带标题)。

※ 尽量保证标题的完整度,仅去掉无法使用的符号(/\|<>?*:")

注意:需要安装ffmpeg才可使用

ffmpeg下载地址: https://ffmpeg.zeranoe.com/builds/

ffmpeg安装方法:

解压好下载的压缩包后,再将bin目录加入Path环境变量中 按Win+R 运行 输入cmd 在弹出的框框中输入 ffmpeg ,如果没有出现"既不是内部或外部命令"之类的话就是安装成功了
参考链接: https://jingyan.baidu.com/article/a3a3f81124c5e08da2eb8a29.html

运行截图

批量合成bilibili的m4s缓存文件为MP4格式 ver2.0_第1张图片

工具源码

import os
import json
import random
import time


# 获取时间戳
def getTimeStamp():
    t = time.localtime(time.time())
    return str(t.tm_year) + '_' + str(t.tm_mon) + '_' + str(t.tm_mday) + '_' + str(t.tm_hour) + \
           str(t.tm_min) + str(t.tm_sec) + str(random.randint(10, 99))


# 更正文件名
def correctFileName(name):
    n_list = list(name)
    for i in range(0, len(n_list)):
        index = 0
        for i in n_list:
            if (
                    i == '\\' or i == '/' or i == ':' or i == '*' or i == '?' or i == '\"' or i == '<' or i == '>' or i == '|'):
                n_list.pop(index)
            index = index + 1
    return ''.join(n_list)


# 读取json文件
def readJson(fileName):
    f = open(fileName, encoding='utf-8')
    setting = json.load(f)
    try:
        result = setting['page_data']['download_subtitle']  # 注意多重结构的读取语法
    except KeyError:
        try:
            result = setting['title'] + ' 第' + setting['ep']['index'] + '话 ' + setting['ep']['index_title']
        except KeyError:
            result = getTimeStamp()
    return result


# 获取文件列表
def getFileList(file_dir):
    # 定义三个列表
    title = []
    videoPath = []
    audioPath = []
    # 遍历文件目录
    for root, dirs, files in os.walk(file_dir):
        if ('entry.json' in files):
            tName = readJson(str(root) + '\\entry.json')
            title.append(tName)
        if ('video.m4s' in files and 'audio.m4s' in files):
            videoPath.append(str(root) + '\\video.m4s')
            audioPath.append(str(root) + '\\audio.m4s')
        if (len(title) < len(videoPath)):
            title.append(getTimeStamp())
        if ('0.blv' in files):
            title.pop()
    return [title, videoPath, audioPath]


# 输出mp4文件
def getMP4(title, video_path, audio_path):
    # 生成输出目录
    if not os.path.exists("./output"):
        os.mkdir("./output")
    # 循环生成MP4文件
    for i in title:
        reName = correctFileName(i)
        # 开始生成MP4文件
        if not os.path.exists("./output/" + reName + ".mp4"):
            # 获取临时文件时间戳
            t_stamp = getTimeStamp()
            os.system(
                "ffmpeg -i " + video_path[title.index(i)] + " -i " + audio_path[
                    title.index(i)] + " -codec copy ./output/" + t_stamp + ".mp4")
            # 将临时文件时间戳改为标题名
            os.rename("./output/" + t_stamp + ".mp4", "./output/" + reName + ".mp4")
            print("正在合成...")
            print("标题:" + reName)
            print("视频源:" + video_path[title.index(i)])
            print("音频源:" + audio_path[title.index(i)])
            time.sleep(1)


print("欢迎使用批量合成M4S工具 ver2.0")
fileDir = str(input("请输入含M4S文件的目录:"))
f = getFileList(fileDir)
getMP4(f[0], f[1], f[2])
print("合成完毕")



已编译好的可执行文件(EXE):

链接: https://pan.baidu.com/s/1Vk8AqBKz4ShpiYtyjBNF7Q 提取码: wy5u

你可能感兴趣的:(批量合成bilibili的m4s缓存文件为MP4格式 ver2.0)