什么是音频块?

What is an audio block?

我看到一些句子包含一个词'block'。

Pd lightens its workload by working with samples in blocks rather than individually. This greatly improves performance. The standard block size is 64 samples, but this setting can be changed. (http://pd-tutorial.com/english/ch03.html)

Rendering an audio graph is done in blocks of 128 samples-frames. A block of 128 samples-frames is called a render quantum, and the render quantum size is 128. (https://www.w3.org/TR/webaudio/#rendering-loop)

所以,我想知道的是:

(1) 单独处理样本有什么问题?为什么音频样本按一定大小 (64, 128) 的块分组?

(2) 为什么块大小是2的幂? // 2^6 = 64, 2^7 = 128

(3) 分组后样本去哪了?然后是用声卡什么的播放吗?

音频块是表示音频的浮点数数组。其中数字范围从 [1, -1] 到 0(不是 0.xxxx)是没有声音的。

1. What is wrong with handling samples individually? Why audio samples are grouped by a block of a some size (64, 128) ?

根据我的理解,处理帧中的样本更好,因为网络音频 api 由于性能而在浏览器中运行的方式。不同的帧大小可能会因用户在其 PC 上的性能而异。这类似于视频中的 fps。 在网络音频中有一个名为 ScriptProcesssorNode 的节点,它允许您在特定 buffer/frame 大小的事件处理程序中创建自定义音频处理。但是,缓冲区大小的范围仅为 256 - 16384 或未定义为系统首选。每次函数调用都很简单,它包含一个新的音频帧。基本上就是一个循环。

现在 ScriptProcessorNode 由于表现不佳,现在 deprecated/obsolete。这是因为事件处理程序 onaudioprocess 函数在主线程上,它可以阻止很多事情。这被替换为 AudioWorklet,类似于 ScriptProcessorNode,但每个进程调用只有 128 帧,并且在主线程上保存更好的性能,因为 AudioWorklet 在后台的工作线程上运行.

2. Why the block size is a power of 2? // 2^6 = 64, 2^7 = 128

老实说我不太清楚,但我最好的猜测是这样更容易计算 因为在 8 位相似的数字中,例如 8、16、32、64、128、256 等

3. After grouped, to where the samples go? Are they then played by a sound card or something?

Web 音频 api 是节点图系统,其中样本帧(a.k.a 128 帧块)通过不同的节点,例如效果 BiquadFilterNode 或自定义处理块 AudioWorkletNode,等等。有一个名为AudioDestinationNode的节点,它是用户PC的扬声器硬件输出。任何连接都连接到这个特定的节点,(如果有声音),它将从该连接产生声音。将这些节点想象成一个连接点,A 点是起点,B 点是终点。每个点都是一个处理块,如 AudioWorklet 等,其中 A 点是源,如麦克风或 mp3/wav 文件,B 点是扬声器目标。将它们连接在一起,繁荣!你的声音很棒。

我希望这是有道理的,也是您想要的:)
如有不妥欢迎指正

  1. 去收银台,买一份炸薯条,吃,然后重复直到吃饱。这就是一次处理一个样本的问题——处理每批样本都有很大的固定成本,这与每批样本的大小无关。更大的束 => 更少的束 => 更低的成本。 (权衡是延迟)

  2. 在计算机系统中,大多数块大小都是 2 的幂,无论它们是什么块或用于什么目的。从历史上看,这是因为使用移位而不是除法对 2 的幂进行数学运算效率更高。但是,特别是对于音频,有一些像 FFT 这样常用于处理的变换,只能方便地在 power-of-2 大小的块上实现。

  3. 处理一个块后可能会发生很多事情。最终,如果正在播放声音,每个块将被发送到音频设备驱动程序,它会以某种方式安排它一次一个样本地流式传输到扬声器或耳机。