由于目前没有通用的方法可以从JavaScript中的音轨中读取实时数据,因此我正在使用一个小的library/API来从我从MP3脱机转换的文本文件中读取音量数据。
字符串看起来像这样
!!!!!!!!!!!!!!!!!!!!!!!!!!###"~{~||ysvgfiw`gXg}i}|mbnTaac[Wb~v|xqsfSeYiV`R
][\Z^RdZ\XX`Ihb\O`3Z1W*I'D'H&J&J'O&M&O%O&I&M&S&R&R%U&W&T&V&m%\%n%[%Y%I&O'P'G
'L(V'X&I'F(O&a&h'[&W'P&C'](I&R&Y'\)\'Y'G(O'X'b'f&N&S&U'N&P&J'N)O'R)K'T(f|`|d
//etc...
想法基本上是在歌曲的给定点上,文本文件中对应点处的字符的Unicode码产生一个名义值来表示音量。
该库使用以下内容(此处简化)来转换数据(在这种情况下为立体声轨道):
getVolume = function(sampleIndex,o) {
o.left = Math.min(1,(this.data.charCodeAt(sampleIndex*2|0)-33)/93);
o.right = Math.min(1,(this.data.charCodeAt(sampleIndex*2+1|0)-33)/93);
}
我想先了解一下文件的编码方式以及在这里如何使用它。
93
和33
的意义是什么?按位
|
的目的是什么?这是移植信息的常用方法(即,它是否有名称),或者有更好的方法来移植它?
最佳答案
33
和93
用于归一化!
和~
之间的值。
var data = '!';
Math.min(1,(data.charCodeAt(0*2)-33)/93); // will yield 0
var data = '~';
Math.min(1,(data.charCodeAt(0*2)-33)/93); // will yield 1
var data = '"';
Math.min(1,(data.charCodeAt(0*2)-33)/93); // will yield 0.010752688172043012
var data = '#';
Math.min(1,(data.charCodeAt(0*2)-33)/93); // will yield 0.021505376344086023
// ... and so on
|0
之所以存在,是因为sampleIndex*2
或sampleIndex*2+1
在传递非整数sampleIndex
时将产生非整数值。 |0
会截断小数部分,以防万一有人发送了格式错误的sampleIndex
(即非整数)。