【问题标题】:How to prepend two chars at the beginning of an Int16Array?如何在 Int16Array 的开头添加两个字符?
【发布时间】:2014-09-06 05:47:50
【问题描述】:

出于应用程序特定的原因,我需要在现有 Int16Array 的开头添加这两个字符“a”(a 和一个逗号)

目前我尝试使用此代码,但它似乎无法正常工作:

function convertFloat32ToInt16(buffer) {
    var prefix          = 'a,',
        prefixLength    = prefix.length / 2, // divided by 2 because we deal with 16 bits, not 8 bits
        bufferLength    = buffer.length,
        totalLength     = prefixLength + bufferLength,
        arr             = new Int16Array(totalLength),
        i

    for (i = 0; i < prefixLength; i = i + 2) {
        arr[i] = prefix.charCodeAt(i) + prefix.charCodeAt(i + 1)
    }

    for (i = prefixLength; i < totalLength; i++) {
        arr[i] = Math.min(1, buffer[i - prefixLength]) * 0x7FFF // convert to 16 bit
    }

    return arr.buffer
}

有什么建议可以让我做得更好并修复上面的代码吗?

非常感谢!

【问题讨论】:

    标签: javascript arrays buffer


    【解决方案1】:

    如果您需要在其中存储随机字符,为什么要使用Int16Array?你在问这样做的问题。

    为什么不只使用常规数组?将您对arr 的定义替换为arr = [],并将对buffer 的引用替换为arr

    在任何情况下,如果您想存储随机字符,都需要使用不同的数据结构。你总是可以让你的退货线是这样的:

    return {buffer: arr.buffer, type: prefix}
    

    【讨论】:

    • 我知道你的意思。不能这样做,因为它必须是 Int16Array。我正在将最初在 Float32 中的 WebAudio 样本转换为 16 位有符号整数,然后再将它们发送到服务器。这是因为字节序确实很重要。
    • 此外,我还将视频数据发送到服务器。对于这些流中的每一个,我在缓冲区的开头添加“a”或“v”,以便服务器在编码之前可以区分这两者。
    • 感谢您的尝试,但它必须是 Int16Array 以节省带宽,因为音频样本必须保持 16 位。
    猜你喜欢
    • 2020-12-18
    • 2019-01-10
    • 2021-09-28
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多