最简单、常用、可行 的 B 站视频下载方法(电脑端)

✅ 方法 1:使用第三方在线工具(最简单)

1)小天在线工具 xtonner.com(免费、强烈推荐)

适用于:普通视频 / 番剧 / 高清晰度

步骤:

  1. 打开 B 站视频 → 复制视频地址

  2. 打开 小天全网热门下载器

  3. 粘贴链接 → 自动解析 → 下载

  4. 使用小天合并器进行合并


✅ 方法 2:使用浏览器插件(简单)

1)Tampermonkey + 下载脚本

步骤:

  1. 安装 Tampermonkey(油猴)拓展

  2. 添加脚本:Bilibili 视频下载脚本(Bilibili Evolved)

  3. 打开视频页面 → 页面会出现“下载”按钮

支持:

  • MP4 下载

  • 音视频合并

  • 下载封面 / 字幕


✅ 方法 3:使用 yt-dlp(命令行,功能最强)

如果你会 Python 或命令行,这是最稳的方案。

安装:

pip install yt-dlp

下载 B 站视频:

yt-dlp https://www.bilibili.com/video/BVXXXXXXXXX

下载最高画质:

yt-dlp -f best https://www.bilibili.com/video/BVXXXXXXXXX

下载带弹幕:

yt-dlp --write-danmaku https://www.bilibili.com/video/BVXXXXXXXXX


✅ 方法 4:离线缓存转 MP4(App 本地缓存)

适用于:你已经在手机或电脑客户端缓存过视频。

电脑端路径通常在:

C:\Users\你的用户名\Videos\bilibilicache\

但 B 站缓存文件是 分段的 .blv,需要用 FFmpeg 合并:

ffmpeg -i "input1.blv" -i "input2.blv" -c copy output.mp4

<think>我们面临的问题:在64位Windows系统中使用Node.js(64位)调用32位DLL文件。 根据Windows系统的设计,64位进程(如64位的Node.js)不能直接加载32位的DLL,反之亦然。这是因为64位和32位的内存地址空间不同,指令集也有差异。 解决方案: 1. 使用32位Node.js:最简单方法是使用32位版本的Node.js来运行你的应用,这样就能直接加载32位的DLL。 2. 创建代理进程(Proxy Process):运行一个32位的代理进程(例如使用C#编写一个控制台程序),该进程负责加载32位的DLL并暴露接口(如通过标准输入输出、TCP、命名管道等),然后64位的Node.js进程与这个32位代理进程通信。 3. 使用COM组件:如果DLL支持COM,我们可以将其注册为COM组件,然后在64位Node.js中通过COM调用来使用。但是注意,64位进程调用32位COM组件需要通过DCOM(分布式COM)或者使用一个32位的COM代理(通常由系统自动处理,但需要正确注册)。 4. 使用Wine(在Windows上不适用,但如果是跨平台考虑,在Linux上可以通过Wine运行32位Windows DLL) - 但这里我们讨论的是Windows。 由于我们使用的是Node.js和ffi-napi,这里重点介绍前两种方法方法一:使用32位Node.js 步骤: 1. 卸载当前的64位Node.js,从Node.js官网下载32位安装包重新安装。 2. 确保你的DLL是32位的,并且放置在正确的位置。 3. 使用ffi-napi加载DLL。 但是,如果你的应用需要利用64位系统的内存优势,或者有其他64位模块依赖,那么这种方法可能不适用。 方法二:创建代理进程(推荐) 我们可以编写一个32位的C#程序(因为C#可以方便地调用32位DLL,并且可以编译为32位),然后通过进程间通信(IPC)与Node.js交互。 步骤: 1. 创建一个C#控制台应用程序(目标平台x86),在该程序中加载32位DLL并导出所需功能。 2. 在C#程序中,通过标准输入输出或命名管道与Node.js通信。 3. 在Node.js中,使用子进程模块(child_process)启动这个32位代理程序,并通过标准输入输出或命名管道发送命令和接收结果。 示例: 1. C#代理程序(ProxyAgent.exe)示例代码: ```csharp using System; using System.Runtime.InteropServices; class Program { // 假设我们的DLL函数原型:int add(int a, int b); [DllImport("Your32BitDLL.dll", CallingConvention = CallingConvention.Cdecl)] public static extern int add(int a, int b); static void Main(string[] args) { // 通过标准输入读取参数 string line; while ((line = Console.ReadLine()) != null) { // 解析参数,例如:add 2 3 string[] parts = line.Split(' '); if (parts[0] == "add" && parts.Length == 3) { int a = int.Parse(parts[1]); int b = int.Parse(parts[2]); int result = add(a, b); Console.WriteLine(result); // 输出结果 } } } } ``` 2. 编译这个C#程序为32位(x86)目标平台。 3. Node.js代码: ```javascript const { spawn } = require('child_process'); const proxy = spawn('path/to/ProxyAgent.exe'); proxy.stdout.on('data', (data) => { console.log(`Result: ${data}`); }); proxy.stderr.on('data', (data) => { console.error(`Error: ${data}`); }); // 发送命令 proxy.stdin.write(`add 2 3\n`); // 注意:在实际应用中,你需要设计一个更健壮的通信协议(如JSON格式),并处理异步调用。 ``` 方法三:使用COM组件 如果DLL是一个COM组件,那么我们可以注册它,然后在Node.js中使用win32com等模块来调用。但是,由于我们使用的是64位Node.js,而组件是32位的,我们需要使用32位的注册程序(regsvr32)注册,并且通过COM的跨架构调用机制(实际上系统会使用一个32位的代理进程)。Node.js可以使用如`win32com`模块(通过npm安装)来调用COM组件。 步骤: 1. 以管理员身份运行命令提示符(32位),使用32位的regsvr32注册DLL: %windir%\SysWoW64\regsvr32.exe Your32BitDLL.dll 2. 在Node.js中,使用win32com模块调用该组件。 示例: ```javascript const win32com = require('win32com'); // 创建COM对象 let comObject = win32com.client.Dispatch('YourDLL.YourClass'); // 调用方法 let result = comObject.YourMethod(arg1, arg2); ``` 但是,这种方法要求DLL是COM组件,并且需要了解组件的ProgID和接口。 总结: - 如果条件允许,最简单的办法是使用32位Node.js。 - 如果需要保持64位Node.js,那么推荐使用代理进程的方式,这种方式通用且稳定。 - 如果DLL是COM组件,可以尝试使用win32com模块。 注意:在64位系统上,32位DLL应该放在SysWoW64目录(注意这是为32位程序准备的)或者应用程序的32位子目录中。但是,由于进程架构不同,直接加载不可行,因此上述代理方法是最常用的。 最后,关于ffi-napi本身,它不能跨架构加载DLL,因此直接使用ffi-napi加载32位DLL到64位Node.js进程会导致类似`Error: Dynamic Linking Error: Win32 error 126`(找不到模块)或`193`(不是有效的Win32应用程序)等错误。 请根据你的具体情况选择合适的方法。</think>### 在 64 位 Windows 上使用 Node.js 调用 32 位 DLL 的解决方案 在 64 位 Windows 系统中,Node.js(64 位)无法直接加载 32 位 DLL 文件,因为存在架构不兼容问题。以下是完整的解决方案: --- #### 一、核心解决方法 1. **使用 32 位 Node.js(推荐)** ```bash # 卸载当前 64 位 Node.js # 从官网下载 32 位安装包:https://nodejs.org/download/release/latest-v18.x/win-x86/node.exe node -p "process.arch" # 验证是否显示 ia32 ``` **优点**:无需修改代码,直接兼容 32 位 DLL 2. **创建架构代理层(跨进程通信)** ```javascript // 步骤1:创建 32 位 C# 代理程序(ProxyAgent.exe) using System; using System.Runtime.InteropServices; class Program { [DllImport("Your32bit.dll")] public static extern int TargetFunction(int param); static void Main(string[] args) { Console.WriteLine(TargetFunction(int.Parse(args[0]))); } } ``` ```javascript // 步骤2:Node.js 中通过子进程调用 const { execSync } = require('child_process'); const result = execSync('ProxyAgent.exe 123', { encoding: 'utf-8' }); console.log('DLL 返回:', result); ``` **原理**:通过 32 位进程桥接调用[^1] 3. **使用进程隔离容器** ```javascript // 在 Docker 中运行 32 位环境 docker run -v /path/to/dll:/app -it mcr.microsoft.com/dotnet/framework/sdk:4.8 ``` ```bash # 容器内安装 32 位 Node.js 并执行脚本 > node your-script.js ``` --- #### 二、备选方案 1. **DLL 重编译(需源码)** - 使用 Visual Studio 将 DLL 编译为 64 位版本 - 编译选项:`x64 Release` 目标平台 2. **COM 组件封装** ```javascript // 注册 32 位 DLL 为 COM 组件 regsvr32 Your32bit.dll ``` ```javascript // Node.js 使用 win32com 调用 const win32com = require('win32com'); const comObj = win32com.client.Dispatch('YourDLL.Component'); comObj.Method(param); ``` **注意**:需 DLL 支持 COM 接口[^2] --- #### 三、常见错误处理 | 错误代码 | 原因 | 解决方案 | |----------|------|----------| | **Win32 126** | DLL 或依赖缺失 | 使用 Dependency Walker 检查依赖 | | **Win32 193** | 架构不匹配 | 切换到 32 位 Node.js 或使用代理层 | | **0xC0000005** | 内存访问冲突 | 验证参数类型匹配和内存管理 | --- #### 四、最佳实践建议 1. **开发环境配置** ```bash # 使用 nvm-windows 管理多版本 Node.js nvm install 18.17.1 32-bit nvm use 18.17.1 ``` 2. **生产环境部署** - 将 32 位 Node.js 与代理程序一起打包 - 使用 Inno Setup 创建安装包,自动安装 VC++ 可再发行组件 3. **调试技巧** ```javascript // 检查 DLL 加载能力 const fs = require('fs'); console.log('DLL 存在:', fs.existsSync('Your32bit.dll')); console.log('进程架构:', process.arch); ``` > 通过上述方案,可解决 64
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

于是我说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值