日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

(Python)BiliBili(手机端缓存视频转换)

發布時間:2023/12/20 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (Python)BiliBili(手机端缓存视频转换) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

需求

功能實現分析

需要進行的操作

使用到的技術:Python基礎和ffepeg

需求分析(一個簡單的思維導圖)

源代碼

總結反思:


需求

?這一個將b站手機端緩存直接轉換為可以直接打開的視頻的軟件。 用戶在Config里面設置好之后,運行程序即可實現自動轉換。(這里我將Config里的設置直接復制到了代碼最上方)

功能實現分析

轉換規則:

1.總視頻文件夾 外面的純數字是普通視頻 純數字代表視頻的av號 s_開頭的是番劇類型的視頻2.劇集文件夾 點開av號的文件夾,里面的c_開頭的是視頻的cid3.視頻信息文件夾 點開cid的文件夾,entry.json里面是視頻的json信息,里面有視頻標題,av號(avid)bv號(bvid)還有分p信息(page_data,里面有視頻的cid和分p的名字)還有視頻的清晰度代號(比如80代表1080P) danmaku.xml是視頻的xml彈幕。4.視頻文件夾 點開清晰度代號文件夾,里面有audio.m4s和video.m4s,這種情況用ffmpeg進行合并: ffmpeg -i "audio.m4s" -i "video.m4s" "output.mp4" 這樣就能直接合并為MP4文件。對于blv文件,也是使用ffmpeg直接封裝為MP4: ffmpeg -i "0.blv" -acodec copy -vcodec copy "output.mp4" 要注意,ffmpeg對中文支持不是很好,盡量不要在命令行直接使用中文命名,而是完成操作之后軟件重命名。 ? ?

需要進行的操作

1.打開總文件夾,通過命名將視頻進行分類(3類,番劇類,普通視頻分P類,普通單P視頻)

2.將每一個視頻進行解析。進入視頻json文件中解析視頻信息,從中找到命名信息。

3.將每一個視頻中的視頻文件轉化為MP4文件,bilibili里的視頻文件分為兩種(一種為音頻和視頻分開的兩個m4s文件,一種為blv文件,均不能直接播放)

使用到的技術:Python基礎和ffepeg

需求分析(一個簡單的思維導圖)

?

源代碼

import json import os ? # bilibili緩存視頻地址 input_path = "C:/Users/Promise/Desktop/download" # 保存視頻文件夾 out_path = 'C:/Users/Promise/Desktop/bili_video' # 是否轉換普通視頻類文件 c_video = True # 是否轉換番劇類文件 c_anime = True # 番劇轉換是否放在同一個文件夾(類似唧唧的批量下載) anime_folder = True # 多個分P的視頻是否放在同一個文件夾 video_folder = True # 是否輸出xml彈幕 c_xml = True # 是否把xml彈幕轉換為ass彈幕 xml2ass=True # 是否使用唧唧Down的命名規則,如果為False則使用視頻的cid命名 enable_JJDown_rename = True # 轉換完成后是否刪除源文件 delete_input_file = False ? # 打開總文件夾 def open_download(): ?# 所有緩存視頻all_video = os.listdir(input_path)# 補全路徑list = []for video in all_video:video = input_path + '/' +videolist.append(video)return list ? # 判斷大類型 def judge_huge_type(video):# 根據文件命名判斷類型if 's_' in video:type = 's'return typeelse:type = 'c'return type ? # 判斷普通視頻是否分P def c_judge_p(video_path):# 根據路徑打開文件夾# 根據文件數量判斷是否分Psub_video_list = os.listdir(video_path) ?if len(sub_video_list) > 1:return Trueelse:return False ? def sub_file(video_path):# 根據路徑打開劇集文件夾# 根據文件數量判斷是否分Psub_video_list = os.listdir(video_path)sub_list = []for sub_video in sub_video_list:sub_video = video_path+ '/' +sub_videosub_list.append(sub_video)return sub_list ? def subsub_file(sub_video_path):# 根據劇集路徑進入每一集信息文件夾subsub_video_info = os.listdir(sub_video_path)video_info = []for fileinfo in subsub_video_info:fileinfo = sub_video_path + '/' +fileinfovideo_info.append(fileinfo)return video_info ? def get_name(video_info):# 獲取名稱for video_file_info in video_info:if str(video_file_info).endswith('json'):with open(video_file_info, 'r', encoding='utf8') as out:json_data = json.load(out)# print(json_data['title'])return json_data['title'] ? def get_anime_index(video_info):# 獲取番劇劇集信息for video_file_info in video_info:if str(video_file_info).endswith('json'):with open(video_file_info, 'r', encoding='utf8') as out:json_data = json.load(out)info = ?json_data['ep']result = info['index']+' '+info['index_title'] ?return result ? def get_pages_index(video_info):# 獲取分P視頻信息for video_file_info in video_info:if str(video_file_info).endswith('json'):with open(video_file_info, 'r', encoding='utf8') as out:json_data = json.load(out)info = json_data['page_data']result = info['part'] ?return result ? def last_file(video_info):# 進入最后一個文件夾last_list = []for video_file_info in video_info:if ?not str(video_file_info).endswith('json') and not str(video_file_info).endswith('xml') :last_file_list = os.listdir(video_file_info)for last_file_info in last_file_list:last_file_info = video_file_info + '/' +last_file_infolast_list.append(last_file_info) ?return last_list ? ? def convert_mp4(last_list,last_file_path):# 將兩個m4s文件轉換為MP4文件m4s_count = 0blv_count = 0m4sfile_list = []blvfile_list = []for last_file in last_list:if str(last_file).endswith('m4s'):m4sfile_list.append(last_file)m4s_count += 1elif str(last_file).endswith('blv'):blvfile_list.append(last_file)blv_count += 1else:passif m4s_count == 2:os.system('ffmpeg -i ' + '"' + m4sfile_list[0] + '" ' + '-i' + ' "' + m4sfile_list[1] + '" -acodec copy -vcodec copy ' + '"' + last_file_path + '"')elif blv_count == 1:os.system('ffmpeg -i ' + '"' + blvfile_list[0] + '"' + ' -acodec copy -vcodec copy ' + '"' + last_file_path + '"')else:passprint(last_file_path , '轉換成功!') ? ? ? ? if __name__ == '__main__':# 打開視頻文件夾all_video = open_download()# 遍歷視頻文件夾for video in all_video:# 判斷視頻類型(番劇還是普通視頻)type = judge_huge_type(video)if type == 's':print('番劇')# 如果設置中打開轉換番劇為Trueif c_anime:# 打開劇集文件夾all_sub_video= sub_file(video)# 遍歷劇集文件夾for sub_video in all_sub_video:# 打開每一集視頻信息文件夾video_info = subsub_file(sub_video)# 從json文件中取出視頻相關信息# 視頻名稱name = get_name(video_info)# 劇集名稱index_name = ?get_anime_index(video_info)# 保存位置save_dirpath = out_path# 如果番劇保存需要零開一個文件夾if anime_folder:# 添加一個由番劇名稱組成的文件夾save_dirpath = out_path + '/' + name# 創建文件夾if not os.path.exists(save_dirpath):os.mkdir(save_dirpath)# 寫最終文件路徑last_file_path = save_dirpath + '/' + index_name + '.mp4'last_list = last_file(video_info)# 轉換文件格式convert_mp4(last_list, last_file_path) ? ?else:print('普通')# 同上if c_video:if c_judge_p(video):print('分p')all_sub_video = sub_file(video)for sub_video in all_sub_video:video_info = subsub_file(sub_video) ?name = get_name(video_info)index_name = get_pages_index(video_info)save_dirpath = out_pathif video_folder:save_dirpath = out_path + '/' + nameif not os.path.exists(save_dirpath):os.mkdir(save_dirpath) ?last_file_path = save_dirpath + '/' +index_name +'.mp4'last_list = last_file(video_info)convert_mp4(last_list,last_file_path) ?else:# 同上all_sub_video = sub_file(video)for sub_video in all_sub_video:video_info = subsub_file(sub_video) ?name = get_name(video_info)last_file_path = out_path + '/' + name + '.mp4' ?last_list = last_file(video_info)convert_mp4(last_list, last_file_path) ? ?

總結反思:

1.感覺這個代碼還是盡力封裝了許多函數,但是main函數還是太長了,封裝的效果也不太好,希望接下來可以改進。

2.代碼長了容易記不住名字,所以需要更加規范的命名原則。

3.最后一個for循環里的功能有些可以繼續封裝,但是還是有點懶,最后沒有改進。

4.所有可以進行封裝的功能還是要盡量封裝,也讓代碼有更高的可讀性。

滿懷希望就會所向披靡!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一位剛在CSDN發表文章的Python小萌新

總結

以上是生活随笔為你收集整理的(Python)BiliBili(手机端缓存视频转换)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。