m4s音频视频文件批量合并&重命名为原标题,Python实现

    科技2024-06-20  72

    缘由:最近手机保存的公开课、学习视频越来越多,将手机b站视频上传PC后发现,视频是分开在不同目录,并且是音视频分开的.m4s文件, 以郝斌C语言为例,182集几百个目录和文件,手动合并和修改文件名的念头掐灭在萌芽中,遂用Python2写了这个脚本来实现。 代码如下,仅供学习之用: # coding=gbk import sys, os, re reload(sys) sys.setdefaultencoding( "gbk" ) # 列表转换成字符串输出的时候出现了UnicodeEncodeError: 'ascii' codec can't encode characters in position,加入上面3行解决 def Get_address(): """获取视频地址列表,根据不同视频自己修改存放地址和集数哦 """ # 视频存放地址初始化 addr1 = u"E:\\公开课\\郝斌C语言\\8074534\\" addr_list = [] # 获取每集视频的地址,并存入列表 for i in range(1, 183): addr2 = addr1 + str(i) addr_list.append(addr2) return addr_list def Get_Name(): """获取每集视频标题,并存入列表""" # 名字存放在entry.json文件里,固定的键值对,so用正则按图索骥就好 pat = """"part":"([\s\S]*)","vid""" name_list = [] for i in Get_address(): add2 = i + "\\entry.json" with open(add2, "r") as f: text = f.read() name = re.findall(pat, text) if len(name) != 0: name_list.append(name[0]) else: print i, ":未匹配到文件名信息!" return name_list def Merge(): """准备工作完成,可以用ffmpeg合并音视频了O(∩_∩)O~~ ps:本地要解压ffmpeg并配置好环境变量,未安装的自行搜索哦""" # 获取地址、标题两个函数存放列表的顺序一致,因此每集可以一一对应 for i in xrange(len(Get_address())): name = Get_Name()[i] audio = Get_address()[i] + r"\32" + r"\audio.m4s" video = Get_address()[i] + r"\32" + r"\video.m4s" # Python2的编码问题真的难受,字符串拼接IDE、系统dos 各种编码异常问题(╯﹏╰) cmand = "ffmpeg -i " + '"' + video + '"' + " -i " + '"' + audio + '"' + " -c:v copy -strict experimental " name2 = '"E:/' + name + '.mp4"' cmand = cmand.decode("gbk", "ignore") + name2.decode("utf8", "ignore") print cmand print video, "\n", audio # 调用--> cmd --> ffmpeg 合并视频 os.system(cmand) if __name__ == '__main__': Merge()

    CPU是RYZEN 1700 @3.5G单线程处理,大概花了28分钟,有批量需求的可以用多线程改进。本次结果如下:

     

    Processed: 0.014, SQL: 8