起因是这样的

一天,本人在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;鉴权。 …