From edfb072ab222437eb165562bcb087514b024a016 Mon Sep 17 00:00:00 2001 From: abearxiong Date: Fri, 18 Apr 2025 23:54:21 +0800 Subject: [PATCH] feat: add silent check --- package.json | 12 +++++++++--- src/index.ts | 3 ++- src/silent/index.ts | 27 +++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 src/silent/index.ts diff --git a/package.json b/package.json index 9d9bc48..ba4a033 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,17 @@ { "name": "@kevisual/video", - "version": "0.0.1", + "version": "0.0.2", "description": "", "scripts": { "build": "tsup" }, + "files": [ + "dist" + ], "keywords": [], "author": "abearxiong (https://www.xiongxiao.me)", "license": "MIT", - "packageManager": "pnpm@10.6.2", + "packageManager": "pnpm@10.8.1", "type": "module", "devDependencies": { "@types/node": "^22.14.1", @@ -16,7 +19,10 @@ "typescript": "^5.8.3" }, "exports": { - ".": "./dist/index.mjs" + ".": { + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } }, "publishConfig": { "access": "public" diff --git a/src/index.ts b/src/index.ts index 349da9d..a556259 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ import { encodeWav, decodeWav } from './wav-converter/index.ts'; +import { isSilentNoLength, isChunkSilent } from './silent/index.ts'; -export { encodeWav, decodeWav }; +export { encodeWav, decodeWav, isSilentNoLength, isChunkSilent }; diff --git a/src/silent/index.ts b/src/silent/index.ts new file mode 100644 index 0000000..c09d5a7 --- /dev/null +++ b/src/silent/index.ts @@ -0,0 +1,27 @@ +/** + * 判断是否为无声, + * 方法 1:检查 Buffer 是否全 0(适用于原始 PCM 数据) + * @param chunk + * @returns + */ +export const isSilentNoLength = (chunk: Buffer) => { + const isSilent = Buffer.compare(chunk, Buffer.alloc(chunk.length)) === 0; + return isSilent; +}; + +/** + * 判断是否为无声, 统计振幅(更通用) + * 方法 2:检查每个样本是否低于阈值 + * @param chunk + * @param threshold + * @returns + */ +export function isChunkSilent(chunk: Buffer, threshold = 0.01) { + const floats = new Float32Array(chunk.buffer); + for (let i = 0; i < floats.length; i++) { + if (Math.abs(floats[i]) > threshold) { + return false; // 发现非静音样本 + } + } + return true; // 所有样本均低于阈值 +}