现在b站缓存好的视屏是音视频分离的;output.mp4是合并好的的视屏;
视屏的信息在父路径下的entry.json文件里面,另外一个xml文件是弹幕信息
在手机上安装一个软件Termux
各个版本的下载地址
目前最新的下载地址
pkg install ffmpeg
termux-setup-storage
最好有es文件浏览器路劲复制过来
cd /storage/emulated/0/Android/data/tv.danmaku.bili/download/
ffmpeg -i video.m4s -i audio.m4s -c:v copy -c:a aac -strict experimental output.mp4
批量合并要安装python
pkg install python
安装完成后输入:
python
tv.danmaku.bili/download/视屏的AV号/
import os
import json
def path(path,name):
"""
:param path: 视屏项目的总目录
:param name: audio.m4s 音频的文件名,每个音频的名字是一样的
:return: (视屏路劲,音频路径,视屏信息的json文件路径)
"""
res=[]
base=os.path.abspath(path)
for root,dirs,files in os.walk(base):
if not dirs:
for file in files:
if name in file:
r=os.path.join(root,file)
res.append((r,r.replace('audio.m4s','video.m4s'),os.path.join(os.path.dirname(os.path.dirname(r)),'entry.json')))
return res
def get_info(file_path):
"""
:param file_path: entry.json文件的路径
:return: 视屏的标题信息
"""
with open(file_path,'rb')as f:
obj=json.load(f)
return obj['page_data']['part']
def has_mp4(file_path):
"""
过滤掉已有.mp4文件的目录
:param file_path: 视屏目录
:return: True or False
"""
return any(['.mp4'in x for x in os.listdir(file_path)])
if __name__ == '__main__':
#test
# test=path(".", "audio.m4s")
# print(test)
file_list=path(".", "audio.m4s")
#先测试一个
for x in file_list[:1]:
#全部
#for x in file_list:
video_name=get_info(x[2])
work_path=os.path.dirname(x[0])
#把已转换的目录过滤掉
if has_mp4(work_path):
continue
print(work_path)
#判断是否是win的系统
if "win" in sys.platform:
cmd = 'cd %s & ffmpeg -i audio.m4s -i video.m4s -c:v copy -c:a aac -strict experimental "%s.mp4"' % (
work_path, video_name)
else:
cmd='cd %s ; ffmpeg -i audio.m4s -i video.m4s -c:v copy -c:a aac -strict experimental "%s.mp4"'%(work_path,video_name)
print(cmd)
os.system(cmd)
批处理中的&、&&、|、||、>、>>符号
win10是
cd 1 & cd 1
这里是
cd 1 ; cd 1
Syntax error: “(” unexpected报错的原因的是,获取的文件信息里面有带括号的文件名导致的,给输出的文件名加上引号解决
"%s.mp4"