【问题标题】:Can't find mp3 frame header sync bits in node stream在节点流中找不到 mp3 帧头同步位
【发布时间】:2013-12-28 19:41:57
【问题描述】:

在这个问题上,我几乎走到了尽头。我正在尝试解析 mp3 帧数据,但我很难找到任何帧。我正在使用 Node 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 node.js stream mp3 binary-data


    【解决方案1】:

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

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

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

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

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

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

    无关但值得一提:

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

    • 在同步字跨越两个块的罕见情况下,您的代码会丢失它。

    【讨论】:

    • 非常感谢!我改为阅读 2 个 16 位整数,一切都很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2012-01-24
    • 2021-09-20
    • 2016-12-03
    相关资源
    最近更新 更多