我几乎到了绳索的尽头。我正在尝试解析 mp3 帧数据,但我不得不花时间定位任何帧。我正在使用节点 0.10 并尝试使用较新的流 api(尽管它也不适用于旧的)
我正在缓冲区中循环寻找 11 位同步字,但我从未找到它。
var stream = fs.createReadStream('./myAudioFile.mp3')
stream.on('readable', function(data){
var chunk, header;
while (null !== (chunk = stream.read())) {
for (var i = 0; ( i + 4 ) <= chunk.length; i++) {
header = chunk.readUInt32LE(i)
if( (header & 0xFFE00000) === 0xFFE00000 ) {
//NEVER GET HERE!!!
}
}
}
我在这里错过了什么吗?
你被Javascript按位运算符的怪癖所困扰。让我演示一下。
> 0xffffffff & 0xffe00000
-2097152
> 0xffe00000
4292870144
Javascript 按位运算的结果始终被视为有符号的 32 位整数。由于常量是无符号的 32 位整数,因此它永远不会匹配。
一种可能的解决方法是使用 ~~
对常量执行相同的重整:
if ((header & 0xffe00000) == ~~0xffe00000) {
另一种方法是只读取 16 位整数,因为同步字无论如何都会适合该大小。
不相关但值得一提:
您实际上需要在此处使用
chunk.readUInt32BE(i)
,而不是LE。现在,您可以在流中找到FE FF
的实例,而不是您想要的FF FE
。在极少数情况下,同步字跨越两个块,您的代码会错过它。