当前位置: 首页 > news >正文

基于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.dtcms.com/a/323991.html

相关文章:

  • 组合数学覆盖设计阶段成果:C(12,4)的5组四元组覆盖C(12,3)所有三元组
  • 我如何从安全运维逆袭成企业CSO
  • (LeetCode 面试经典 150 题) 104. 二叉树的最大深度 (深度优先搜索dfs)
  • 鱼的游动+Compute Shader
  • 特征模理论中的特征值、模式重要性、特征角和模式权重系数的物理含义分别是什么?彼此间存在什么数学关系?如何用CST 仿真软件查看这些参数?
  • 一篇文章解决 Win10 同时部署多个版本的Tomcat
  • WiFi原理与WiFi安全
  • 【秋招笔试】2025.08.09美团秋招算法岗机考真题-第一题
  • C语言——深入理解指针(二)
  • JavaSE:入门
  • LeetCode 组合总数
  • 五种Excel表格导出方案
  • 40.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--初始化网关
  • Pytorch深度学习框架实战教程-番外篇05-Pytorch全连接层概念定义、工作原理和作用
  • afsim2.9_使用QtCreator和VSCode编译
  • ShadowKV 机制深度解析:高吞吐长上下文 LLM 推理的 KV 缓存“影子”方案
  • GPT OSS深度解析:OpenAI时隔6年的开源模型,AI民主化的新里程碑?
  • FFmpeg实现音视频转码
  • Java 日常开发笔记(小程序页面交互传参-id)
  • ATF(TF-A)安全通告 TFV-13(CVE-2024-7881)
  • 《从零构建大语言模型》学习笔记4,注意力机制1
  • ubuntu22.04安装autoware.universe
  • 【YOLOv8改进 - C2f融合】C2f融合Outlook Attention:将细粒度特征编码到 token 中, 提高在图像分类和语义分割等任务中的性能
  • Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived + HAProxy 负载均衡)
  • 106-基于Flask的重庆充电桩投建数据可视化分析系统
  • Spring Boot WebSocket实时在线人数统计
  • 从onnx模型到om模型的全自动化转化
  • Spring Boot集成WebSocket
  • Vue 3 的编译时优化如何改写 DOM 操作规则
  • ubuntu超简单自动化Vim配置