This commit is contained in:
熊潇 2025-04-16 16:37:11 +08:00
commit 2d29bcc489
12 changed files with 1277 additions and 0 deletions

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
node_modules
dist
.DS_Store
.env*
!.env*example

2
.npmrc Normal file
View File

@ -0,0 +1,2 @@
//npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN}
//registry.npmjs.org/:_authToken=${NPM_TOKEN}

2
demos/test-convert/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
files/*
!files/test.pcm

Binary file not shown.

View File

@ -0,0 +1,12 @@
import { encodeWav, decodeWav } from '../../src/wav-converter';
import fs from 'fs';
const pcm = fs.readFileSync('./files/test.pcm');
const wav = encodeWav(pcm, {
sampleRate: 16000,
numChannels: 1,
byteRate: 16,
});
console.log(wav);
fs.writeFileSync('./files/test.wav', wav);

24
package.json Normal file
View File

@ -0,0 +1,24 @@
{
"name": "@kevisual/video",
"version": "0.0.1",
"description": "",
"scripts": {
"build": "tsup"
},
"keywords": [],
"author": "abearxiong <xiongxiao@xiongxiao.me> (https://www.xiongxiao.me)",
"license": "MIT",
"packageManager": "pnpm@10.6.2",
"type": "module",
"devDependencies": {
"@types/node": "^22.14.1",
"tsup": "^8.4.0",
"typescript": "^5.8.3"
},
"exports": {
".": "./dist/index.mjs"
},
"publishConfig": {
"access": "public"
}
}

1102
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

2
readme.md Normal file
View File

@ -0,0 +1,2 @@
# kevisual videos

3
src/index.ts Normal file
View File

@ -0,0 +1,3 @@
import { encodeWav, decodeWav } from './wav-converter/index.ts';
export { encodeWav, decodeWav };

View File

@ -0,0 +1,69 @@
type EncodeWavOptions = {
numChannels?: number;
sampleRate?: number;
byteRate?: number;
};
/**
* pcm文件为wav文件
* @param rawPCM
* @param options
* @returns
*/
export function encodeWav(rawPCM: Buffer | string, options?: EncodeWavOptions) {
if (typeof rawPCM === 'string') {
rawPCM = Buffer.from(rawPCM, 'binary');
}
if (!Buffer.isBuffer(rawPCM)) {
throw new TypeError('pcm data must be Buffer or string');
}
const opt = options || {};
const sampleRate = opt.sampleRate || 16000;
const numChannels = opt.numChannels || 1;
const byteRate = opt.byteRate || 16;
const buf = rawPCM;
const header = Buffer.alloc(44);
header.write('RIFF', 0);
header.writeUInt32LE(buf.length, 4);
header.write('WAVE', 8);
header.write('fmt ', 12);
header.writeUInt8(16, 16);
header.writeUInt8(1, 20);
header.writeUInt8(numChannels, 22);
header.writeUInt32LE(sampleRate, 24);
header.writeUInt32LE(byteRate, 28);
header.writeUInt8(4, 32);
header.writeUInt8(16, 34);
header.write('data', 36);
header.writeUInt32LE(buf.length + 44 - 8, 40);
return Buffer.concat([header, buf]);
}
/**
* wav文件
* @param rawWav
* @returns
*/
export function decodeWav(rawWav: Buffer | string) {
if (typeof rawWav === 'string') {
rawWav = Buffer.from(rawWav, 'binary');
}
if (!Buffer.isBuffer(rawWav)) {
throw new TypeError('pcm data must be Buffer or string');
}
// remove the header of pcm format
rawWav = rawWav.subarray(44);
return rawWav;
}
export const converter = {
encodeWav,
decodeWav,
};

34
tsconfig.json Normal file
View File

@ -0,0 +1,34 @@
{
"compilerOptions": {
"module": "NodeNext",
"target": "esnext",
"noImplicitAny": false,
"outDir": "./dist",
"sourceMap": false,
"allowJs": true,
"newLine": "LF",
"baseUrl": "./",
"typeRoots": [
"node_modules/@types",
],
"declaration": false,
"noEmit": true,
"allowImportingTsExtensions": true,
"moduleResolution": "NodeNext",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"esModuleInterop": true,
"paths": {
"@/*": [
"src/*"
],
}
},
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules",
]
}

20
tsup.config.ts Normal file
View File

@ -0,0 +1,20 @@
import { defineConfig } from 'tsup';
// import glob from 'fast-glob';
// const services = glob.sync('src/services/*.ts');
const entrys = ['src/index.ts'];
export default defineConfig({
entry: entrys,
outExtension: ({ format }) => ({
js: format === 'esm' ? '.mjs' : '.js',
}),
splitting: false,
sourcemap: false,
clean: true,
format: 'esm',
external: ['dotenv'],
dts: true,
outDir: 'dist',
tsconfig: 'tsconfig.json',
});