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

时间:2013-12-28 19:41:58

标签: javascript node.js stream mp3 binary-data

我差点就在这条绳子的尽头。我正在尝试解析mp3帧数据,但我有一段时间定位任何帧。我正在使用Node 0.10并尝试使用更新的流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!!!
            }
        }
    }

我在这里遗漏了什么吗?

1 个答案:

答案 0 :(得分:3)

你被Javascript按位运算符的怪癖所困扰。让我演示一下。

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

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

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

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

另一种方法是只读取16位整数,因为无论如何同步字都适合该大小。

无关但值得一提:

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

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