audio - 在 Squeak Smalltalk 中解码 WAV 文件

标签 audio wav smalltalk squeak

我正在 Squeak 中开发一个小项目,但遇到了一个问题:我无法正确解码 WAV 文件。

这是我目前用来解码的两种方法:

convert4bitUnsignedTo16Bit: anArray
    "Convert the given array of samples--assumed to be 4-bit unsigned, linear data--into 16-bit signed samples. Return an array containing the resulting samples. I only thinking it is unsigned. I don't really know."
| n samples s |
n _ anArray size.
samples _ SoundBuffer newStereoSampleCount: (n * 2).
1 to: n do: [:i |
    s _ anArray at: i.
    samples at: (i * 2) put: (self imaDecode: s).
    samples at: ((i * 2) - 1) put: (self imaDecode: s)].
^ samples

.

imaDecode: number
| n |
n _ number.
n >= 128 ifTrue: [n _ n - 256].
^ (n) * 16

它以正确的速率发出声音,如果我仔细听,我可以听到原始的声音。但它非常静态。

我想知道是否有人能发现我的代码有什么问题,并帮助我找出为什么声音如此静态。 (顺便说一句:我会从 SampledSound 中的 readFrom: 方法调用 convert4bitUnsignedFrom16Bit: 方法,并以 data 变量作为参数)。

-CompModder

最佳答案

解码器方法的输入是一个ByteArray。每个 8 位字节以 4 位编码存储两个样本。假设这是一个立体声轨道,那么左/右声道将存储在每个字节的高/低 4 位中。您的 imaDecode: 方法不会提取这些位。我认为它应该看起来更像这样(显然未经测试):

1 to: n do: [:i |
    byte := anArray at: i.
    left := byte bitAnd: 15.                 "lower 4 bits"
    right := (byte >> 4) bitAnd: 15.         "upper 4 bits"
    samples at: (i * 2) put: (left - 8) << 12.
    samples at: ((i * 2) - 1) put: (right - 8) << 12].

这会将 4 位值放入 leftright 中,并按 -8 偏置它们(假设它们实际上已签名)并扩展 12 位成为完整的 16 位签名样本。

顺便说一句,我认为您的缓冲区大小太大,其 stereoSampleCount 应该是 n 而不是 n * 2

此外,如果您需要进一步帮助,您可能需要将示例文件发布到 Squeak 开发人员邮件列表。

关于audio - 在 Squeak Smalltalk 中解码 WAV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35963648/

相关文章:

python - 音频帧包含什么?

smalltalk - 将对象数组显示为表格

polymorphism - Smalltalk 中的 "unbounded dynamic polymorphism"是什么

node.js - 在 AWS Lambda 中使用 Node.js 流上传音频文件

python - SciPy:读取 .wav 文件中的标记时间和标签

iphone - iOS:在LockScreen中显示当前播放的轨道信息吗?

python - 你如何在 python 中将 ulaw wav 文件转换为 PCM?

smalltalk - 在 Seaside 等 Web 应用程序框架中处理 Excel 文件

javascript - 当音频包含在另一个PHP文件中时,音频不起作用

javascript - 音频结束后隐藏按钮