现在b站缓存好的视屏是音视频分离的;output.mp4是合并好的的视屏;
视屏的信息在父路径下的entry.json文件里面,另外一个xml文件是弹幕信息
在手机上安装一个软件Termux
各个版本的下载地址
目前最新的下载地址
1.安装ffmpeg
pkg install ffmpeg
2.申请访问手机目录
termux-setup-storage
3.找到手机上视屏的缓存路劲
最好有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
1.安装python
pkg install python
安装完成后输入:
python
如下图所示
把代码放到视屏路径下
tv.danmaku.bili/download/视屏的AV号/
win10版
ffmpeg批量合并b站的视屏和音频并修改文件的名称
import osimport jsondef 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 resdef 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):continueprint(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"