因为偶然间发现之前关注的视频被下架了. 不过幸好手机端有缓存. 但是手机看视频哪有电脑看着舒服呢? 所以想把视频导出到电脑上观看, 结果发现哔哩哔哩对视频进行了处理. 将视频,弹幕,音轨分3个文件储存,一直打开文件夹最后会看到video(视频),audio(音频)两个m4s文件,以视频方式打开video只会有视频,没有声音,打开audio只有声音没有视频(T_T).
所以, 制作了这个小工具. 将视频音频合二为一. 仅供参考.
更新: 添加exe程序, 方便不会代码的小伙伴们使用.
百度网盘链接:https://pan.baidu.com/s/1pGZ99b_SHz25C35iMfdzpQ
提取码:17wm
使用方法:
1. 请将手机中bilibili缓存文件夹拷贝到folder文件夹. 方法如下:
(1).打开手机“文件管理”
(2).在目录中找到Android文件夹(一般打开文件管理后就看得到这个文件夹,部分机型位于“0”文件夹中)
(3).打开data文件夹
(4).找到“tv.danmaku.bili”
(5).里面的download中可以找到下载视频的av号.
(6).将这个文件夹拷贝到folder文件夹.
2. 运行export_video.exe (源码在export_video.py 中)
3. 等待程序执行结束.
源码如下:
#!usr/bin/env python3
# -*- encoding:utf-8 -*-import os
import json
import subprocess# 读取文件夹内的json文件, 获取文件名称,当前章节
def get_video_information(json_path):data1 = json.load(open(json_path, 'r', encoding='utf-8'))# print('title: ', data1['title'])title = data1['title']# print("page_data: ", data1['page_data']['part'])page_data = data1['page_data']['part']return title, page_datadef get_file_path(file_path='folder'):"""需要的文件类型: entry.json:return:"""file_list = []if os.path.exists(file_path):for root, dirs, files in os.walk(file_path):if 'index.json' in files:file_list.append(root) # root为需要转换的地址# print(file_list)return file_listelse:print('请检查“folder”文件夹是否存在。并确保要转换的文件夹放置在 folder 文件夹下。')return Falsedef video_add_mp3(file_name, mp3_file, report_name="1"):"""视频添加音频:param file_name: 传入视频文件的路径:param mp3_file: 传入音频文件的路径:param report_name: 导出视频文件名/路径:return: True / False"""report_name = report_name if '.' in report_name else report_name + '.mp4'try:subprocess.call('ffmpeg -i ' + file_name+ ' -i ' + mp3_file + ' -strict -2 -f mp4 '+ report_name, shell=True)return Trueexcept:return Falsedef create_video():file_list = get_file_path()if file_list:# 获取文件夹正确名称, 名称在上级目录的entry.json中for f in file_list:f_path = ''a = f.split('\\')[:-1]for _path in a:f_path = os.path.join(f_path, _path)f_path = os.path.join(f_path, "entry.json")title, page_data = get_video_information(f_path)# 创建文件夹title = os.path.join('export', title)os.makedirs(title, exist_ok=True)# 拼接视频文件video_add_mp3(os.path.join(f, 'video.m4s'), os.path.join(f, 'audio.m4s'),os.path.join(title, page_data + '.mp4'))if __name__ == '__main__':create_video()