【发布时间】:2020-05-14 00:23:04
【问题描述】:
我正在编写一个与 libalsa 交互的 Go 程序。我将 PCM 数据存储在 []int16 切片中,但要调用 libalsa,我需要将其存储在 []byte 切片中。
如何将 []int16 切片转换为 []byte 以完成此操作?
【问题讨论】:
-
请注意,将 int16 数据转换为字节需要您选择某种字节顺序,因为您必须将每个 16 位值分解为两个 8 位值。 wiki.multimedia.cx/index.php/PCM#Byte_Order 表明 little-endian 是最常见的顺序。我不知道你使用的例程是否需要这个顺序。
-
我还要补充一点,如果您正在与 C 代码交互,您可能不想复制字节而是执行类型转换(通过包
unsafe)。这是因为 libalsa'a 代码可能期望*char仅仅是因为这是在 C 中定义“任何类型的数据数组”的最低公分母——前提是接受这样一个数组的函数也接受一个值,该值告诉数组中有数据。我在暗示这一点,因为通常在处理 RT 音频时,减少延迟是最重要的,而仅仅为了类型兼容性而将数据复制到内存中可能是不明智的。 -
...所以,如果你真的通过`cgo` 连接
libalsa,你可能会问一个更广泛的问题。