B站緩存視頻數據m4s轉mp4

B站緩存視頻數據m4s轉mp4

  • 結構分析

結構分析

在沒有改變數據存儲目錄的情況下,b站默認數據保存目錄為:
`Android->data->tv.danmaku.bili->download`

在這里插入圖片描述
每個文件夾代表一個集合的視頻,比如,我下載的”java從入門到精通“,那么就會保存到一個目錄里面:
在這里插入圖片描述
每個以c_開頭的都是一個小章節。
在這里插入圖片描述
每個小章節包含entry.json(視頻標題及章節名稱等信息),danmaku.xml(彈幕),64或80等(視頻文件及音頻文件等)
在這里插入圖片描述
將audio.m4s以及video.m4s合成后就是一個完整的視頻。本地得安裝ffmpeg或者使用python-ffmpeg。
關鍵部分代碼:

command = ["ffmpeg","-i", video_m4s,  # 輸入視頻文件"-i", audio_m4s,  # 輸入音頻文件'-c:v', 'copy',  # 不重新編碼視頻'-c:a', 'copy',  # 不重新編碼音頻"-y",  # 覆蓋已存在的文件output_mp4  # 輸出文件]# 使用 subprocess.run 執行命令result = subprocess.run(command)

將整個標題的視頻轉換出來。

#!/usr/bin/python3
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
import subprocess
import os
import json
import ffmpegdef select_source():# 選擇視頻源目錄dir_path = filedialog.askdirectory(title="選擇視頻源目錄")if dir_path:source_entry.delete(0, END)source_entry.insert(0, dir_path)def select_target():# 選擇保存目錄dir_path = filedialog.askdirectory(title="選擇視頻保存目錄")if dir_path:target_entry.delete(0, END)target_entry.insert(0, dir_path)def convert_with_ffmpeg(video_m4s, audio_m4s, output_mp4):if os.path.getsize(video_m4s) < 0 or os.path.getsize(audio_m4s) <= 0:print("非法的音視頻文件,{audio_m4s},視頻文件:{video_m4s}")return Falsetry:# 輸入視頻和音頻video = ffmpeg.input(video_m4s)audio = ffmpeg.input(audio_m4s)# 構造 FFmpeg 命令command = ["ffmpeg","-i", video_m4s,  # 輸入視頻文件"-i", audio_m4s,  # 輸入音頻文件'-c:v', 'copy',  # 不重新編碼視頻'-c:a', 'copy',  # 不重新編碼音頻"-y",  # 覆蓋已存在的文件output_mp4  # 輸出文件]# 使用 subprocess.run 執行命令result = subprocess.run(command)# 檢查命令是否成功執行if result.returncode == 0:print(f"{output_mp4} -> 合并成功!")return Trueelse:print(f"合并失敗, 視頻文件:{video_m4s}, 音頻文件:{audio_m4s}")print(f"錯誤信息: {result.stderr}")return Falseexcept ffmpeg.Error as e:print(f"合并失敗,音頻文件:{audio_m4s},視頻文件:{video_m4s}")return Falsedef batch_convert_vedio(source_path, target_path):for dir in os.listdir(source_path):dir_path = os.path.join(source_path, dir)entry_file = os.path.join(dir_path, "entry.json")data_dir = os.listdir(dir_path).pop(0)audio_path = os.path.join(dir_path, data_dir, "audio.m4s")vedio_path = os.path.join(dir_path, data_dir, "video.m4s")with open(entry_file, 'r', encoding='utf-8') as f:entry_sjon = f.read()json_data = json.loads(entry_sjon)part_content = json_data.get("page_data", {}).get("part")title = json_data.get("title")if not os.path.exists(os.path.join(target_path, f'{title}')):os.makedirs(os.path.join(target_path, f'{title}'))target_vedio_path = os.path.join(target_path, f'{title}/{part_content}.mp4')convert_with_ffmpeg(vedio_path, audio_path, target_vedio_path)print(target_vedio_path)def convert_video():source_path = source_entry.get()target_path = target_entry.get()if not source_path or not target_path:messagebox.showerror("錯誤", "請選擇源目錄和目標目錄!")else:batch_convert_vedio(source_path, target_path)messagebox.showinfo("成功", f"視頻將從 {source_path} 轉換保存到 {target_path}")root = Tk()
root.title("bili視頻轉換工具")# 設置窗口大小并居中
window_width = 500  # 稍微加寬窗口
window_height = 200
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2
root.geometry(f"{window_width}x{window_height}+{x}+{y}")# 配置網格布局權重
for i in range(5):root.grid_columnconfigure(i, weight=1)
for i in range(4):root.grid_rowconfigure(i, weight=1)# 視頻源目錄選擇
source_label = Label(root, text="視頻源目錄:")
source_label.grid(row=0, column=0, sticky="e", padx=5, pady=5)source_entry = Entry(root)
source_entry.grid(row=0, column=1, columnspan=3, sticky="ew", padx=5, pady=5)source_button = Button(root, text="瀏覽...", command=select_source)
source_button.grid(row=0, column=4, sticky="ew", padx=5, pady=5)# 視頻保存目錄選擇
target_label = Label(root, text="視頻保存目錄:")
target_label.grid(row=1, column=0, sticky="e", padx=5, pady=5)target_entry = Entry(root)
target_entry.grid(row=1, column=1, columnspan=3, sticky="ew", padx=5, pady=5)target_button = Button(root, text="瀏覽...", command=select_target)
target_button.grid(row=1, column=4, sticky="ew", padx=5, pady=5)# 轉換按鈕
button_convert = Button(root, text="立即轉換", command=convert_video)
button_convert.grid(row=2, column=1, columnspan=3, sticky="ew", padx=50, pady=20)# 進入消息循環
root.mainloop()

具體效果如下:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83766.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一次Oracle的非正常關閉

數據庫自己會關閉嗎&#xff1f; 從現象來說Oracle MySQL Redis等都會出現進程意外停止的情況。而這些停止都是非人為正常關閉或者暴力關閉&#xff08;abort或者kill 進程&#xff09; 一次測試環境的非關閉 一般遇到這種情況先看一下錯誤日志吧。 2025-06-01T06:26:06.35…

linux 串口調試命令 stty

linux 串口調試命令 stty 文章目錄 linux 串口調試命令 sttystty 常見命令選項&#xff1a;常用參數&#xff1a;一次性設置串口所有常見參數總結 stty&#xff08;設置終端行模式&#xff09;命令是用來配置終端設備&#xff08;包括串口設備&#xff09;的輸入和輸出行為的工…

【地址區間劃分】

地址區間劃分 1 decode_addr1.1 地址區間1.2 變式 本篇博客主要介紹對地址區間劃分的一個比較巧妙參數化的做法。 1 decode_addr 遇到一個master轉多個slave時&#xff0c;不可避免需要進行對addr總線進行分配地址區間來進行選中&#xff1b; 在這里給出一個可復用且設計思想比…

mysql復合查詢mysql子查詢

基礎表結構創建 表結構包含主外鍵約束和字符集配置&#xff0c;確保數據完整性 部門表 CREATE TABLE dept (deptno int NOT NULL COMMENT 部門編號,dname varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 部門名稱,loc varchar(20) CHARACTE…

vlan(虛擬局域網)邏輯圖解+實驗詳解

VLAN&#xff08;Virtual Local Area Network&#xff0c;虛擬局域網&#xff09; 是一種通過邏輯方式&#xff08;非物理連接&#xff09;將網絡設備劃分為多個獨立廣播域的技術。它允許管理員在同一個物理網絡中創建多個隔離的虛擬網絡&#xff0c;從而提升網絡的安全性、靈…

2025年—Comfy UI 和 Stable Diffusion底層原理

為什么要先講SD原理 &#xff1f; 邏輯理解: ComfyUI是節點式操作&#xff0c;需要自行搭建工作流&#xff0c;理解原理才能靈活定制工作流學習效率: 基礎原理不懂會導致后續學習吃力&#xff0c;原理是掌握ComfyUI的關鍵核心價值: ComfyUI最有價值的功能就是自主搭建工作流&a…

深入理解C#中的Web API:構建現代化HTTP服務的完整指南

在當今的軟件開發領域&#xff0c;構建高效、可擴展的Web服務已成為一項基本需求。作為.NET開發者&#xff0c;C#中的Web API框架為我們提供了創建RESTful服務的強大工具。本文將全面探討Web API的核心概念、實現細節和最佳實踐&#xff0c;幫助您掌握這一關鍵技術。 一、Web A…

起重機指揮人員在工作中需要注意哪些安全事項?

起重機指揮人員在作業中承擔著協調設備運行、保障作業安全的關鍵職責&#xff0c;其安全操作直接關系到整個起重作業的安全性。以下從作業前、作業中、作業后的全流程&#xff0c;詳細說明指揮人員需注意的安全事項&#xff1a; 一、作業前的安全準備 資質與狀態檢查&#xff…

【高等數學】傅里葉級數逼近例子

f ( x ) π 2 ? ∣ x ∣ f(x)\frac{\pi}{2}-|x| f(x)2π??∣x∣ 由于是偶函數只需要求 cos ? ( n x ) , 1 \cos(nx),1 cos(nx),1 的系數 a n 0 a_n 0 an?0, n n n 是偶數 a n 1 ( 2 n ? 1 ) 2 a_n \frac{1}{(2n-1)^2} an?(2n?1)21?, n n n 是奇數 則 f ( x )…

PowerBI企業運營分析—全動態盈虧平衡分析

PowerBI企業運營分析—全動態盈虧平衡分析 歡迎來到Powerbi小課堂&#xff0c;在競爭激烈的市場環境中&#xff0c;企業運營分析平臺成為提升競爭力的核心工具。 該平臺通過整合多源數據&#xff0c;實現關鍵指標的實時監控&#xff0c;從而迅速洞察業務動態&#xff0c;精準…

用ApiFox MCP一鍵生成接口文檔,做接口測試

日常開發過程中&#xff0c;尤其是針對長期維護的老舊項目&#xff0c;許多開發者都會遇到一系列相同的困擾&#xff1a;由于項目早期缺乏嚴格的開發規范和接口管理策略&#xff0c;導致接口文檔缺失&#xff0c;甚至連基本的接口說明都難以找到。此外&#xff0c;由于缺乏規范…

26考研 | 王道 | 計算機組成原理 | 三、存儲系統

26考研 | 王道 | 計算機組成原理 | 三、存儲系統 文章目錄 26考研 | 王道 | 計算機組成原理 | 三、存儲系統3.1 存儲系統基本概念3.2 主存儲器1. 主存儲器的基本組成2. SRAM與DRAM1.DRAM和SRAM對比2.DRAM的刷新3.DRAM的地址線復用技術 3. 只讀存儲器ROM4.雙端口RAM和多模塊存儲…

IDEA 開發PHP配置調試插件XDebug

1、安裝PHP環境 為了方便&#xff0c;使用的PhpStudy。 安裝路徑&#xff1a;D:\resources\phpstudy_pro\Extensions\php\php7.3.4nts 2、下載Xdebug Xdebug: Downloads 選擇對應的版本下載&#xff0c;本次使用的是7.3。 3、配置Xdebug 在php.ini中添加Xdebug配置。 D…

Go 語言的 GC 垃圾回收

序言 垃圾回收&#xff08;Garbage Collection&#xff0c;簡稱 GC&#xff09;機制 是一種自動內存管理技術&#xff0c;主要用于在程序運行時自動識別并釋放不再使用的內存空間&#xff0c;防止內存泄漏和不必要的資源浪費。這篇文章讓我們來看一下 Go 語言的垃圾回收機制是如…

60天python訓練計劃----day45

DAY 45 Tensorboard使用介紹 知識點回顧&#xff1a; tensorboard的發展歷史和原理tensorboard的常見操作tensorboard在cifar上的實戰&#xff1a;MLP和CNN模型 之前的內容中&#xff0c;我們在神經網絡訓練中&#xff0c;為了幫助自己理解&#xff0c;借用了很多的組件&#x…

RocketMQ基礎概念的理解

1、生產者 生產者和主題之間存在多對多關系。一個生產者可以向多個主題發送消息&#xff0c;一個主題可以接收來自多個生產者的消息。這種多對多關系有助于提高性能擴展和災難恢復能力。 2、消費者以及消費者組 一個隊列可以被多個消費者&#xff08;其中這多個消費者必須分…

Flash燒錄速度和加載配置速度(純FPGA ZYNQ)

在工程綜合完成或者implement完成后&#xff0c;打開綜合設計或者實現設計。 toots--->Edit Device Properties--->打開比特流設置 將bitstream進行壓縮 上圖中&#xff0c;時鐘頻率選擇的檔位有限&#xff0c;最大為66MHZ io的bus width可以設置為x1,x2,x4 vivado在設計…

優化09-表連接

一、表連接介紹 表連接類型 表連接是關系型數據庫關鍵特性&#xff0c;在關系型數據庫中&#xff0c;表連接分為三類&#xff1a;循環嵌套連接&#xff08;Nested Loops Join&#xff09;、哈希連接&#xff08;Hash Join&#xff09;、合并排序連接&#xff08;Merge Sort J…

Dify工作流實踐—根據word需求文檔編寫測試用例到Excel中

前言 這篇文章依賴到的操作可查閱我之前的文章&#xff1a; dify里的大模型是怎么添加進來的&#xff1a;在Windows本地部署Dify詳細操作 flask 框架app.route()函數的開發和調用&#xff1a;PythonWeb開發框架—Flask工程創建和app.route使用詳解 結構化提示詞的編寫&…

AWTK 嵌入式Linux平臺實現多點觸控縮放旋轉以及觸點丟點問題解決

前言 最近涉及海圖的功能交互&#xff0c;多點觸摸又開始找麻煩。 在PC/Web平臺awtk是通過底層的sdl2庫來實現多點觸摸&#xff0c;但是在嵌入式Linux平臺&#xff0c;可能是考慮到性能原因&#xff0c;awtk并沒有采用sdl庫來做事件處理&#xff0c;而是自己實現一個awtk-lin…