吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 106|回复: 0
上一主题 下一主题
收起左侧

[其他原创] 游戏音频转换成可播放的音频文件

[复制链接]
跳转到指定楼层
楼主
N79823 发表于 2024-11-20 18:42 回帖奖励
完整项目地址:https://gitee.com/pmhw/bnk/tree/master


支持游戏内置 .bnk 音频转换可以播放的音频,其它格式文件 请修改源代码 · 理论支持所有游戏音频格式文件,本文拿《永劫无间》举例

用到的技术栈 nodejs 上手还是比较快的 后续再写一个python原生版本的

因为主要调用的是第三方插件的 cmd 命令所以选择nodejs

一、具体思路:

开始想用  ww2ogg.exe 和 revorb.exe ww2ogg 转换wem 然后 revorb 修复

然后
ffmpeg 转换 wem 为音频格式 但是奈何ffmpeg 太臃肿了 300多mb 果断放弃

使用现成的 vgmstream

vgm 用于播放视频游戏中使用的数百种流式(预录)音频格式的库 官网:https://vgmstream.org/



二、直接上代码:


[JavaScript] 纯文本查看 复制代码
const fs = require('fs');
const path = require('path');
const { exec } = require('child_process');
child_process



[JavaScript] 纯文本查看 复制代码
// 配置工具路径
const vgmstreamW64 =  path.join(__dirname, 'plugin', 'vgmstream-win64', 'vgmstream-cli.exe');

// 配置工作目录
const bnkDirectory = path.join(__dirname, 'bnks'); // .bnk 文件所在目录
const outputDirectory = path.join(__dirname, 'ext'); // 输出目录



[JavaScript] 纯文本查看 复制代码
// 迁移到ext文件
function extractWemFiles(bnkFile) {

    const data = fs.readFileSync(bnkFile);
    
    // 假设文件的第 128 字节后是音频数据(具体需根据 .bnk 格式调整)
    // const wemDataOffset = 128;
    // const wemData = data.slice(wemDataOffset);
    // 保存全部data

    // 保存为临时 .wem 文件
    const wemFilePath = path.join(outputDirectory, `${path.basename(bnkFile, '.bnk')}.bnk`);
    fs.writeFileSync(wemFilePath, data);


    return wemFilePath;
}

// 将 .wem 转换为 .ogg 的方法
function convertWemToOgg(wemFile) {
    // console.log(wemFile)
    // 执行 ww2ogg 转换
    exec(`"${vgmstreamW64}" "${wemFile}"`, (err, stdout, stderr) => {
        if (err) {
            console.error(`转换失败: ${stderr}`);
            return;
        }
        fs.unlinkSync(wemFile)
        console.log(`转换成功:${wemFile}`)

    });
}

// 主函数:处理目录中的所有 .bnk 文件
function processBnkFiles() {
    // 检查并创建输出目录
    if (!fs.existsSync(outputDirectory)) {
        fs.mkdirSync(outputDirectory);
    }

    // 遍历目录中的所有 .bnk 文件
    const bnkFiles = fs.readdirSync(bnkDirectory).filter(file => file.endsWith('.bnk'));
    if (bnkFiles.length === 0) {
        console.error('未找到任何 .bnk 文件!');
        return;
    }

    bnkFiles.forEach(file => {
        const bnkFilePath = path.join(bnkDirectory, file);
        const wemFile = extractWemFiles(bnkFilePath);
        convertWemToOgg(wemFile);
    });
}

// 启动程序
processBnkFiles();






具体以永劫无间为例:




以永劫无间为例,首先找到






.bnk 游戏音乐文件存放位置 D:\Naraka\program\NarakaBladepoint_Data\StreamingAssets\Audio\GeneratedSoundBanks\Windows\Chinese(CN)
直接检索 哈迪(hadi)













殷紫萍:zipingyin武田信忠:takeda顾清寒:justinagu胡桃:kurumi迦南:matari季沧海火男:tarka特木尔风男:temulch天海和尚:tenkai崔三娘:valda宁红叶:viper无尘:wuchen妖刀:yotohime岳山:yueshan哈迪:hadi



全选复制到程序 bnks 目录





然后运行 终端 node bnk.js





至此转换成可以播放的音频文件,其他格式文件(非 .bnk)请自行修改代码

免费评分

参与人数 1热心值 +1 收起 理由
puyuancheng + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 13:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表