音视频文件批量转换并重命名(python)

最近在 bwiki 为爱发电时,遇到的需求如下:大佬已经将角色语音解包出来,需要按照一定规则进行重命名,并将 wav 格式转换为 mp3 格式,方便统一上传到 bwiki。

新文件名格式为:角色名(即所在子文件夹名 ) + 语音类型名 + 配音语言(中配则默认不加)。

此前并没有学过 python,但还是现学并试着写了一下;需求比较简单,并没有做 IO 和异常处理,最终代码如下(涉及到解包文件,故改换文件信息):

python 复制代码
# 警告:由于缺少异常处理,建议使用前先将语音文件夹备份
# 注意:使用前请将 ffmpeg 添加到系统环境变量中


import os
import subprocess


# 将 "typename" 放在最后以防止重复匹配
type_name_mapping = {
    "typename_1": "语音类型1",
    "typename_2": "语音类型2",
    "typename_3": "语音类型3",
    "typename": "语音类型",
}


def match_sub_str(file_name):
    for key in type_name_mapping:
        if "%" in file_name:  # 跳过废弃的配音
            break
        if key in file_name:
            if "ja" in file_name:
                return type_name_mapping[key] + "-ja"  # 为日配统一增加后缀
            else:
                return type_name_mapping[key]
    return "废弃_" + file_name  # 为废弃配音统一增加前缀


def rename_wav_file(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for file_name in files:
            for folder_name in os.path.relpath(root, folder_path).split(os.path.sep):  # 获取子文件夹名
                name = os.path.splitext(file_name)  # 分离文件名与扩展名
                old_file_path = root + os.sep + file_name
                new_file_path = root + os.sep + folder_name + "-" + match_sub_str(name[0]) + name[1]
                os.rename(old_file_path, new_file_path)


def delete_obsolete_file(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for file_name in files:
            if "废弃_" in file_name:  # 删除废弃配音
                os.remove(root + os.sep + file_name)


def wav_to_mp3(folder_path):
	# 这里可以修改为任意 ffmpeg 命令
    str_mod = 'ffmpeg -threads 20 -i "{}" -f mp3 -ab 192k -y "{}"'
    for root, dirs, files in os.walk(folder_path):
        for file_name in files:
            input_file_path = os.path.join(root, file_name)
            if file_name[-4:] == ".wav":
                output_file_path = input_file_path.replace(".wav", ".mp3")
                str_cmd = str_mod.format(input_file_path, output_file_path)

                # 打印 ffmpeg 编码过程
                print(str_cmd)
                p = subprocess.Popen(str_cmd, shell=True, stdout=subprocess.PIPE)
                for line in iter(p.stdout.readline, b''):
                    print(line.strip().decode('utf-8'))


def delete_wav(folder_path):
    for root, dirs, files in os.walk(folder_path):
        for file_name in files:
            if file_name[-4:] == ".wav":  # 删除所有 wav 格式音频文件
                os.remove(root + os.sep + file_name)


if __name__ == '__main__':
    path = "请输入语音文件路径"
    rename_wav_file(path)
    delete_obsolete_file(path)
    wav_to_mp3(path)
    delete_wav(path)

算是简单记录一个小模板吧,以后如果有批量转换和重命名的场景也能直接套用。

相关推荐
yunsr1 小时前
python作业3
开发语言·python
源文雨1 小时前
shell调用ffmpeg递归转换所有wav至flac的脚本
ffmpeg·bash·音视频·音频·unix·shell·音频编码
历程里程碑1 小时前
普通数组-----除了自身以外数组的乘积
大数据·javascript·python·算法·elasticsearch·搜索引擎·flask
曦月逸霜1 小时前
Python快速入门——学习笔记(持续更新中~)
笔记·python·学习
喵手1 小时前
Python爬虫实战:采集菜谱网站的“分类/列表页”(例如“家常菜”或“烘焙”频道)数据,构建高可用的美食菜谱数据采集流水线(附CSV导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集菜谱网站数据·家常菜或烘焙频道·构建高可用食谱数据采集系统
喵手1 小时前
Python爬虫实战:硬核解析 Google Chrome 官方更新日志(正则+文本清洗篇)(附 CSV 导出)!
爬虫·python·爬虫实战·零基础python爬虫教学·csv导出·监控谷歌版本发布历史·获取稳定版更新日志
星火开发设计1 小时前
this 指针:指向对象自身的隐含指针
开发语言·数据结构·c++·学习·指针·知识
梵刹古音1 小时前
【C++】构造函数
开发语言·c++
小邓睡不饱耶1 小时前
实战|W餐饮平台智能化菜品推荐方案(含Spark实操+算法选型+完整流程)
python·ai·ai编程·ai写作
独自破碎E1 小时前
【曼哈顿距离】BISHI25 最大 FST 距离
java·开发语言