基于FFmpeg的B站視頻下載處理

起因是這樣的

一天,本人在B站客戶端緩存了一個視頻,用于學習參考等學術交流,但是視頻和音頻卻是分開且通過Win Hex查看發現文件頭含有9個“30”,想到一個個手動刪字節不如讓程序取代,便有了本文章

這一篇文章發布之前,其實早在5個月以前就完成了代碼

代碼流程

不同語言可以參考流程來做(本教程介紹Console版本的單文件處理)

1、獲取ffmpeg的路徑

如題,我們首先需要ffmpeg,可以去網上隨便什么地方下一個編譯好的ffmpeg放在程序文件夾下,然后獲取ffmpeg的路徑

Dim ff As String = Path.GetDirectoryName(Process.GetCurrentProcess.MainModule.FileName) & "\ffmpeg.exe"

2、獲取 想要處理的 文件

Console.WriteLine("輸入要轉換的文件路徑:")
Dim arg As String
arg = Console.ReadLineIf IO.File.Exists(arg) = False ThenConsole.WriteLine("文件不存在!")Continue Do
End IfDim f As New FileStream(arg, FileMode.Open)

3、定義音頻和視頻判定字節

(這里說明一下,絕大部分B站客戶端下載的視頻是mpg格式的視頻,文件內部二進制數據會包含Video或Sound等字符來標記是視頻還是音頻,但是少部分格式不清楚,因此本程序保留了未知格式,可以降低錯判率)

Dim vid As Byte() = {&H56, &H69, &H64, &H65, &H6F}
Dim sod As Byte() = {&H53, &H6F, &H75, &H6E, &H64}Dim flag As Boolean = False
f.Position = 0For i = 0 To f.Length - 1Dim buf = f.ReadByteDim array1(3) As ByteIf buf = &H53 Thenf.Read(array1, 0, 4)If CompareByte(sod, sod(0), array1) ThenConsole.WriteLine("此文件是音頻,輸入""/""以重新輸入")flag = TrueExit ForEnd IfElseIf buf = &H56 Then 'If buf(0) = &H56 Thenf.Read(array1, 0, 4)If CompareByte(vid, vid(0), array1) ThenConsole.WriteLine("此文件是視頻,輸入""/""以重新輸入")flag = TrueExit ForEnd IfEnd If
NextIf flag = False ThenConsole.WriteLine("輸入的格式可能不準確,除非你知道你自己在做什么!輸入""/""以重新輸入")
End If

匹配字節

Function CompareByte(OriginalByte As Byte(), firstByte As Byte, LastBytes As Byte())If firstByte = OriginalByte(0) ThenFor i = 0 To LastBytes.Count - 1If LastBytes(i) <> OriginalByte(i + 1) ThenReturn FalseEnd IfNextReturn TrueElseReturn FalseEnd If
End Function

這里解釋下為何要使用這一種方法來匹配文件類型……

因為如果你直接讀取所有的音頻文件到內存再轉成Array,且不說上限有多少,代碼會比這個復雜,而且占用大量系統資源,小一點的音頻還好,如果是4K視頻,內存都要炸翻天。

所以我們使用字節流的方式,f.ReadByte一次,字節讀取位置就+1,但凡匹配到0x56,0x53的就開始匹配后面4位是否一致,如果一致了,就按對應格式告訴用戶這個是視頻還是音頻。

4、讓用戶輸入轉換后的名稱

f.Position = 0
Console.WriteLine("輸入轉換后文件名稱,新文件保存于原文件同一個目錄下,請加上后綴!例如as.mp4")Dim newfname As String
newfname = Console.ReadLine
If newfname = "/" ThenContinue Do
End If
Dim newpath As String = Path.GetDirectoryName(arg) & "\" & newfname
Dim w As New FileStream(newpath, FileMode.Create)Dim count As Integer = f.Length

5、詢問用戶刪多少個字節

一般客戶端為9個,UWP(不支持版本)是3個而且音視頻合體

Console.WriteLine("輸入刪除視頻前多少個byte,建議查看WinHex")
Dim start As Integer = CInt(Console.ReadLine())For i = 0 To start - 1f.ReadByte()
NextFor i = 0 To count - start - 1w.WriteByte(f.ReadByte)
Next
w.Close()
f.Close()Process.Start(ff, "-i " & newfname & " " & newpath)Console.WriteLine("轉換成功!")

錯誤處理就不做了,獲取ffmpeg的數據流太麻煩了

敬告

注意,此方法僅用于學習和參考,請勿用于非法用途!!!

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

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

相關文章

【Vue Router】路由模式、懶加載、守衛、權限、緩存

前言 Vue Router 是 Vue 生態中處理頁面跳轉的核心工具&#xff0c;它解決了單頁應用中 URL 管理、組件切換、狀態維護等關鍵問題&#xff0c;同時提供了豐富的功能&#xff08;如動態路由、嵌套路由、路由守衛&#xff09;。除了經常用到的路由配置以外&#xff0c;我們還需了…

Linux epoll 實現詳解 (fs/eventpoll.c)

核心數據結構分析 1. struct eventpoll (epoll 實例核心結構) c struct eventpoll {struct mutex mtx; // 保護 epoll 結構的互斥鎖wait_queue_head_t wq; // epoll_wait() 使用的等待隊列wait_queue_head_t poll_wait; // 文件 poll() 使用的等待隊列struc…

【牛客刷題】小紅的項鏈(字節跳動面試題)

文章目錄 一、題目介紹 1.1 輸入描述 1.2 輸出描述 1.3 示例 二、算法設計思路 三、流程圖 四、題解實現 五、復雜度分析 六、關鍵算法知識點 一、題目介紹 原題鏈接:https://www.nowcoder.com/practice/3da065cab096478eb603bbfca5af8b02 小紅將 n n n個珠子排成一排,然后…

【Html網頁模板】HTML炫酷星空(一閃一閃亮晶晶)

文章目錄專欄導讀功能預覽快速開始核心實現拆解1. 背景與基礎布局2. 背景層靜態星空&#xff08;輕微閃爍&#xff09;3. 前景層“亮晶晶”的閃爍小星星4. 交互與動效5. 行星裝飾可配置項與個性化建議初始化順序&#xff08;入口&#xff09;源碼結語專欄導讀 &#x1f525;&am…

第一天-CAN Signal信號的Multiplexor多路復用在DBC中實現

&#x1f680; CAN總線的“變形金剛術”&#xff1a;Multiplexor多路復用信號深度揭秘在汽車電子江湖中&#xff0c;當數百個ECU爭相發送數據時&#xff0c;如何讓一條CAN報文像"變形金剛"一樣自由切換形態&#xff1f;Multiplexor&#xff08;多路復用&#xff09;技…

Code Exercising Day 10 of “Code Ideas Record“:StackQueue part02

文章目錄【150. Evaluate Reverse Polish Notation】【239. Sliding Window Maximum】【347. Top K Frequent Elements】【150. Evaluate Reverse Polish Notation】 Problem Link Approach: Use a stack. Push numbers onto the stack; when encountering an operator, pop t…

系統架構設計師備考之架構設計高級知識

1.系統架構設計基礎知識1.1.軟件架構概念軟件架構定義軟件架構&#xff08;Software Architecture&#xff09;或稱軟件體系結構&#xff0c;是指系統的一個或者多個結構&#xff0c;這些結構包括軟件的構件&#xff08;可能是程序模塊、類或者是中間件&#xff09;、構件的外部…

PWM波的頻譜分析及matlab 驗證[電路原理]

你知道嗎&#xff1f;pwm可以制作adc模塊哦&#xff01;這樣普通的gpio也能實現adc功能了。 我們嵌入式日常接觸的pwm波&#xff0c;你真的了解他嗎&#xff1f; 只有知道PWM的頻譜是怎么樣的&#xff0c;才能設計合適的濾波器&#xff0c;下面我們一起從底層數學原理來推導PWM…

相機、鏡頭參數詳解以及相關計算公式

一、工業相機參數 1、分辨率 相機每次采集圖像的像素點數&#xff0c;也是指這個相機總共有多少個感光晶片。在采集圖像時&#xff0c;相機的分辨率對檢測精度有很大的影響&#xff0c;在對同樣大的視場成像時&#xff0c;分辨率越高&#xff0c;對細節的展示越明顯。 相機像素…

通信中間件 Fast DDS(一) :編譯、安裝和測試

目錄 1.簡介 2.Windows編譯、安裝和測試 2.1.編譯環境準備 2.2.編譯安裝 2.2.1.安裝FastCDR 2.2.2.安裝Foonathan Memory 2.2.3.安裝FastDDS 2.3.驗證安裝 3.Linux編譯、安裝和測試 3.1.編譯環境準備 3.2.編譯安裝 3.2.1.安裝FastCDR 3.2.2.安裝Foonathan M…

NI USRP X410 無線電上的雷達目標仿真

此示例展示如何在 NI? USRP? 無線電的 FPGA 上部署雷達目標仿真算法。 介紹 在本例中&#xff0c;您將從 Simulink 模型入手&#xff0c;該模型可模擬最多四個雷達目標響應。您將按照分步指南&#xff0c;在 Simulink 中從該模型生成比特流&#xff0c;并使用生成的 MATLAB 主…

PyTorch 深度學習實戰教程-番外篇04:卷積層詳解與實戰指南

標簽&#xff1a;# 深度學習 #人工智能 #神經網絡 #PyTorch #卷積神經網絡 相關文章&#xff1a; 《Pytorch深度學習框架實戰教程01》 《Pytorch深度學習框架實戰教程02&#xff1a;開發環境部署》 《Pytorch深度學習框架實戰教程03&#xff1a;Tensor 的創建、屬性、操作與…

LeetCode 面試經典 150_數組/字符串_分發糖果(15_135_C++_困難)(貪心算法)

LeetCode 面試經典 150_數組/字符串_分發糖果&#xff08;15_135_C_困難&#xff09;題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;貪心算法&#xff09;&#xff1a;代碼實現代碼實現&#xff08;思路一&#xff08;貪…

配置timer控制 IO的輸出(STC8)

使用STC8的Timer控制IO輸出 STC8系列單片機具有多個定時器&#xff0c;可以用于精確控制IO口的輸出狀態。以下是使用Timer0和Timer1控制IO輸出的方法。 初始化Timer0 配置Timer0為16位自動重裝模式&#xff0c;用于周期性控制IO輸出&#xff1a; /************************ 定時…

【Python練習】086. 編寫一個函數,實現簡單的DHCP服務器功能

086. 編寫一個函數,實現簡單的DHCP服務器功能 086. 編寫一個函數,實現簡單的DHCP服務器功能 安裝依賴庫 示例代碼 代碼說明 示例輸出 注意事項 擴展功能 DHCP服務器功能實現方法 依賴庫安裝 基本功能實現 功能說明 運行方法 注意事項 擴展功能 086. 編寫一個函數,實現簡單的…

生產環境Tomcat運行一段時間后,如何測試其性能是否滿足后續使用

要測試生產環境中已運行一段時間的Tomcat性能是否滿足后續使用需求&#xff0c;需從基礎監控、負載壓力測試、配置合理性校驗、穩定性驗證等多維度入手&#xff0c;結合工具和實際業務場景定位瓶頸&#xff0c;確保其能應對未來可能的流量增長。以下是具體方法和步驟&#xff1…

Qt中的設計模式:經典的MVC,MVP和MVVM

Qt中的設計模式&#xff1a;經典的MVC&#xff0c;MVP和MVVM 前言 ? 筆者這里最近正在研究經典的三大 Model/View 框架&#xff0c;不得不說&#xff0c;我先前的確寫過Qt在這里的體現&#xff0c;但是&#xff0c;筆者認為之前的文章中&#xff0c;我只是機械的memcpy的Qt的…

Windows浮動ip怎么配置

Windows浮動IP怎么配置&#xff0c;達到IP漂移的效果&#xff0c;方法肯定是有的&#xff0c;這里我推薦一款好用的高可用Vip漂移軟件PanguVip&#xff0c;我們先看下最終達到的效果圖&#xff0c;如下所示PanguVip軟件免費下載百度網盤為您提供文件的網絡備份、同步和分享服務…

[langchain] Sync streaming vs Async Streaming

我不太清楚langchain中的sync stream 和 async steam有什么關系和區別sync stream from langchain.chat_models import init_chat_model from langchain_deepseek.chat_models import ChatDeepSeek import dotenv dotenv.load_dotenv()messages [ ("system", &quo…

nginx下lua的實現機制、Lua錯誤處理、面向對象

nginx下lua的實現機制 nginxlua概述 nginx&#xff1a;功能由模塊提供。 http模塊、events模塊&#xff0c;mail模塊。 處理http請求的時候&#xff0c;可以利用模塊做一些功能&#xff1a;eg&#xff1a;登錄校驗&#xff0c;js合并&#xff0c;數據庫訪問&#xff0c;鑒權。 …