在节点stream中找不到mp3帧头同步位

我几乎是在这一个绳索的末尾。 我试图parsing出的MP3帧数据,但我有一个时间定位任何帧的熊。 我正在使用节点0.10,并尝试使用新的streamapi(虽然它不适用于旧的)

我正在循环寻找11位同步字的缓冲区,但我从来没有find它。

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按位运算符所困扰。 让我来certificate一下。

 > 0xffffffff & 0xffe00000 -2097152 > 0xffe00000 4292870144 

Javascript按位操作的结果始终视为有符号的 32位整数。 由于你的常量是一个无符号的32位整数,它永远不会匹配。

一个可能的解决方法是使用~~来对常量执行相同的修改:

 if ((header & 0xffe00000) == ~~0xffe00000) { 

另一种方法是只读16位整数,因为同步字将适合这种大小。

不相关但值得一提的是:

  • 你实际上需要在这里使用chunk.readUInt32BE(i) ,而不是LE。 现在你正在stream中findFE FF实例,而不是你想要的FF FE

  • 在less数情况下,同步字跨越两个块,您的代码会错过它。