B站視頻下載批量拼接合成工具


簡介說明

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已全部處理完成!")
B站視頻處理腳本

 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')
重命名

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM