缘由:最近手机保存的公开课、学习视频越来越多,将手机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分钟,有批量需求的可以用多线程改进。本次结果如下: