簡介說明
B站對於單個視頻的下載很簡單,可以在瀏覽器裝插件,這里不再贅述。本文主要介紹對於多P視頻的批量下載,資源整合處理。
提供兩種方式:
- 執行py腳本
- 運行exe工具
准備工作
1. 在windows應用商店下載B站客戶端
2. 安裝ffmpeg軟件,並添加path環境變量,下載地址:https://ffmpeg.zeranoe.com/builds/。添加環境變量方法這里不再具體介紹,不懂可以百度。
3.pip安裝ffmpy3模塊(用exe工具不需要)
視頻下載
打開客戶端,可以自己設置下載路徑,支持多集批量下載,,下載格式支持MP4,flv格式
但是下載下來的緩存文件,每種格式都會有問題,這也就是這個工具產生的原因。
1.批量下載的文件MP4格式為音頻視頻分割;
2.flv格式長視頻進行了分切多個短視頻;
3.視頻文件名為數字串碼
下載后的文件
功能介紹
1. 對於下載的MP4格式文件語音、視頻合成,重命名。處理耗時較長,吃cpu,內存,不建議下載此格式
2. 對於下載的flv格式文件進行拼接,重命名
獲取方法
1.腳本源文件

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 該腳本用於批處理Windows商店B站客戶端下載文件。 5 說明: 6 1.批量下載的文件MP4格式為音頻視頻分割; 7 2.flv格式長視頻進行了分切多個短視頻; 8 3.視頻文件名為數字串碼 9 環境准備: 10 1. 下載ffmpeg軟件並加載環境變量,下載地址:https://ffmpeg.zeranoe.com/builds/ 11 2. pip安裝ffmpy3模塊 12 功能: 13 1. 對於下載的MP4格式文件語音、視頻合成,重命名。處理耗時較長,不建議下載此格式 14 2. 對於下載的flv格式文件進行拼接,重命名 15 """ 16 import json, os, datetime 17 from ffmpy3 import FFmpeg 18 19 # 源視頻下載路徑 20 source_dir = str(input("請輸入視頻源文件夾:")) 21 # 處理后視頻的輸出路徑,並新建視頻標題文件夾 22 target_dir = str(input("請輸入輸出文件夾:")) 23 24 25 def file_handler(root, files): 26 output_dir = "" 27 audio_path = "" 28 video_path = "" 29 flv_list = [] 30 31 for file in files: 32 33 if file.endswith(".info"): 34 file_name, dir_name = get_video_info(root, file) 35 save_dir = os.path.join(target_dir, dir_name) 36 if not os.path.exists(save_dir): 37 os.mkdir(save_dir) 38 output_dir = os.path.join(save_dir, file_name) 39 40 if file.startswith("audio"): 41 audio_path = os.path.join(root, file) 42 if file.startswith("video"): 43 video_path = os.path.join(root, file) 44 if file.endswith(".flv"): 45 flv_list.append(os.path.join(root, file)) 46 return output_dir, audio_path, video_path, flv_list 47 48 49 def get_video_info(root, file): 50 json_dir = os.path.join(root, file) 51 with open(json_dir, "r", encoding="utf-8")as f: 52 info_dic = json.load(f) 53 file_name = info_dic['PartName'] 54 file_name = file_name.replace(" ", "") 55 dir_name = info_dic['Title'] 56 return file_name, dir_name 57 58 59 def mp4_handler(video_path, audio_path, output_dir): 60 ff = FFmpeg(inputs={str(video_path): None, str(audio_path): None}, 61 outputs={str(output_dir + '.mp4'): '-c:v h264 -c:a ac3 -v quiet -y'}) 62 # print(ff.cmd) 63 ff.run() 64 65 66 def creat_flv_list_file(root, flv_list): 67 flv_list_dir = os.path.join(root, "flv_list.txt") 68 with open(flv_list_dir, 'a', encoding='utf-8')as f: 69 for i in flv_list: 70 f.write("file '{}'\n".format(i)) 71 return flv_list_dir 72 73 74 def flv_concat(flv_list_dir, output_dir): 75 # 不加safe參數報錯,-v quiet不顯示處理過程,-y覆蓋已存在 76 ff = FFmpeg(global_options="-f concat -safe 0 ", inputs={str(flv_list_dir): None}, 77 outputs={output_dir + '.flv': "-c copy -v quiet -y"}) 78 # print(ff.cmd) 79 ff.run() 80 81 82 def flv_handler(root, flv_list, output_dir): 83 flv_list_dir = creat_flv_list_file(root, flv_list) 84 flv_concat(flv_list_dir, output_dir) 85 if os.path.exists(flv_list_dir): 86 os.remove(flv_list_dir) 87 88 89 if __name__ == '__main__': 90 start = datetime.datetime.now() 91 total = 0 92 count = 0 93 94 for root, dirs, files in os.walk(source_dir): 95 runtime = datetime.datetime.now() - start 96 if not total: 97 total = len(dirs) 98 print("\r正在處理:第{}個 " 99 "共:{}個 " 100 "已用時:{}".format(count, total, runtime), end='') 101 count += 1 102 103 is_video = file_handler(root, files) 104 if is_video: 105 output_dir, audio_path, video_path, flv_list = is_video 106 if video_path and audio_path and output_dir: 107 mp4_handler(video_path, audio_path, output_dir) 108 if output_dir and flv_list: 109 # print(flv_list) 110 flv_handler(root, flv_list, output_dir) 111 print("\n已全部處理完成!")
GitHub項目地址:https://github.com/yin-man/bilibli_video
2.打包后的exe工具
https://files.cnblogs.com/files/yinhaiping/bilibili.zip
使用方法
輸入下載的文件路徑=>Enter=>輸入要輸出的文件路徑=>Enter=>wait.......
對於一部1.1G的flv視頻處理時間約為10s,速度還是相當快的
處理后的展示
最后
使用過程中,如遇到問題,歡迎評論留言。
2020-05-28更新
最近B站增加了視頻合並功能,腳本更新如下:

#!/usr/bin/env python # -*- coding:utf-8 -*- import os, json from shutil import copyfile # 源視頻下載路徑 source_dir = input("請輸入視頻源文件夾:") # 處理后視頻的輸出路徑,並新建視頻標題文件夾 target_dir = input("請輸入輸出文件夾:") def get_video_info(json_dir): with open(json_dir, "r", encoding="utf-8")as f: info_dic = json.load(f) file_name = info_dic['PartName'] dir_name = info_dic['Title'] return file_name, dir_name for root, dirs, files in os.walk(source_dir): path_l = [] output_dir = '' for file in files: path_l.append(os.path.join(root, file)) for path in path_l: if path.endswith('.info'): file_name, dir_name = get_video_info(path) save_dir = os.path.join(target_dir, dir_name) if not os.path.exists(save_dir): os.mkdir(save_dir) output_dir = os.path.join(save_dir, file_name) for path in path_l: if not output_dir: break if path.endswith('.mp4'): copyfile(path, output_dir + '.mp4') if path.endswith('.flv'): copyfile(path, output_dir + '.flv')