我在 JavaScript (AppsScript) 中混合简单的无符号 8 位/8kHz 线性 PCM 音频样本时遇到了最困难的情况。我已经尝试了这里列出的所有基本数学,使用基本数字数组。
- 签名、添加、剪辑、取消签名。从每个字节中减去 128,添加它们,剪辑,然后添加 128。
- 产生平均值,每个样本只有 a[x]+b[x]/2
- Viktor T. Toth的,数学相关。
完整示例如下。这将要求您授权 Google Drive 访问音频样本(不,它不会触及您的任何内容): https ://script.google.com/macros/s/AKfycbzMOWV5Z5soG3uinrFc0WcscNXxsDq9elE9rzG0t703vsvDJZMS/exec
如您所见,这 3 个混合结果非常可怕。我一直认为无符号字节只是偏移了 128。不是这样吗? 我是否需要折叠一半字节才能获得真正的线性表示?JavaScript 中的基本数字是否不能正确转换为有符号/无符号表示? 如果是这种情况,Java/AppsScript 会以某种方式正确地处理两个真实样本。
更新 下面是一些特定的代码,其输出在上面的链接中。唉,它根本不起作用(JavaScript 中的字节折叠)?
var vegaArray = DriveApp.getFileById('0B-e9EqGm0pWPQ3RUTXFyUERDVTA').getBlob().getBytes();
var fdraArray = DriveApp.getFileById('0B-e9EqGm0pWPaUJQUmFRQWctNG8').getBlob().getBytes();
for(var i=44;i<vegaArray.length;i++)
vegaArray[i] = Math.round( ( 2 * (vegaArray[i] + fdraArray[i]) )
- ( vegaArray[i] * fdraArray[i] / 128 )
- 256
); // for
// vegaArray[] is the mixed output