Javascript Can';在节点流中找不到mp3帧头同步位

Javascript Can';在节点流中找不到mp3帧头同步位,javascript,node.js,stream,mp3,binary-data,Javascript,Node.js,Stream,Mp3,Binary Data,在这件事上,我几乎穷途末路了。我试图解析出mp3帧数据,但我很难找到任何帧。我正在使用Node 0.10并尝试使用较新的stream api(尽管它也不能与旧的流api一起使用) 我在缓冲区中循环寻找11位同步字,但从未找到它 var stream = fs.createReadStream('./myAudioFile.mp3') stream.on('readable', function(data){ var chunk, header; while (null !

在这件事上,我几乎穷途末路了。我试图解析出mp3帧数据,但我很难找到任何帧。我正在使用Node 0.10并尝试使用较新的stream api(尽管它也不能与旧的流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!!!
            }
        }
    }
var-stream=fs.createReadStream('./myAudioFile.mp3')
stream.on('readable',函数(数据){
var-chunk,header;
while(null!=(chunk=stream.read()){

对于(var i=0;(i+4)而言,您正被Javascript按位运算符的怪癖所困扰。让我来演示一下

> 0xffffffff & 0xffe00000
-2097152
> 0xffe00000
4292870144
Javascript按位操作的结果始终被视为有符号32位整数。由于常量是无符号32位整数,因此它永远不会匹配

一种可能的修复方法是使用
~
对常量执行相同的损坏:

if ((header & 0xffe00000) == ~~0xffe00000) {
另一种方法是只读取16位整数,因为同步字无论如何都适合该大小

不相关但值得一提的是:

  • 实际上,您需要在此处使用
    chunk.readUInt32BE(i)
    ,而不是LE。现在您正在流中找到
    FE FF
    的实例,而不是您想要的
    FF FE

  • 在罕见的情况下,一个同步字跨越两个块,您的代码会忽略它


非常感谢!我改为阅读2个16位整数,一切都很好