"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > PHP Master | Extraire un extrait d'un fichier WAV

PHP Master | Extraire un extrait d'un fichier WAV

Publié le 2025-03-22
Parcourir:706

PHP Master | Extract an Excerpt from a WAV File

虽然 PHP 以构建网页和应用程序而闻名,但它的功能远不止于此。我最近需要动态地从 WAV 文件中提取一段音频,并允许用户通过浏览器下载。我尝试寻找符合我需求的库,但没有成功,不得不自己编写代码。这是一个深入研究 WAV 文件结构的好机会。在这篇文章中,我将简要概述 WAV 文件格式,并解释我开发的库:Audero Wav Extractor。

关键要点

  • 波形音频文件格式 (WAV) 是微软用于存储数字音频数据的标准,由表示音频文件不同部分的块组成。“RIFF”、“Fmt”和“Data”是最重要的块。
  • Audero Wav Extractor 是一个 PHP 库,允许从 WAV 文件中提取片段。它需要 PHP 5.3 或更高版本,可以将片段保存到本地硬盘、通过用户的浏览器下载或将其作为字符串返回以供以后处理。
  • Audero Wav Extractor 库包含 downloadChunk()saveChunk()getChunk() 等方法来管理提取过程。每种方法都需要提取片段的起始和结束时间参数。
  • WAV 文件的持续时间可以使用以下公式计算:time = dataChunkSize / (sampleRate * channelsNumber * bitsPerSample / 8)。此信息以及其他重要数据可以从 WAV 文件的“Data”和“Fmt”块中检索。

WAV 格式概述

波形音频文件格式,也称为 WAVE 或 WAV,是微软用于存储数字音频数据的文件格式标准。WAV 文件由一组不同类型的块组成,这些块代表音频文件的不同部分。您可以将此格式想象成 HTML 页面:第一个块就像网页的

部分,因此在其中您可以找到有关文件本身的几条信息,而包含音频数据本身的块则位于页面的
部分。在这种情况下,“块”指的是文件中包含的数据部分。最重要的格式块是“RIFF”,它包含文件的字节数;“Fmt”,它包含采样率和声道数等重要信息;以及“Data”,它实际上包含音频流数据。每个块至少必须有两个字段:id 和大小。此外,每个有效的 WAV 至少必须有两个块:Fmt 和 Data。第一个通常位于文件的开头,但在 RIFF 之后。每个块都有其自己的格式和字段,并且一个字段构成块的子部分。WAV 格式过去未被充分指定,这导致文件具有不严格遵循规则的标头。因此,当您处理音频时,您可能会发现一个文件具有一个或多个字段,甚至最重要的字段设置为零或错误的值。为了让您了解块内部的内容,每个 WAV 文件的第一个块是 RIFF。其前 4 个字节包含字符串“RIFF”,接下来的 4 个字节包含文件大小减去这两个数据部分使用的 8 个字节。RIFF 块的最后 4 个字节包含字符串“WAVE”。您可能会猜到这些数据的目的是什么。在这种情况下,您可以使用它们来识别您正在解析的文件实际上是否是 WAV 文件,就像我在库的 Wav 类中 setFilePath() 方法中所做的那样。另一个需要解释的有趣的事情是如何计算 WAV 文件的持续时间。您需要的所有信息都可以从前面提到的两个必须的块中检索,它们是:数据块大小、采样率、声道数和每样本位数。计算文件时间(以秒为单位)的公式如下:

time = dataChunkSize / (sampleRate * channelsNumber * bitsPerSample / 8)

假设我们有:

dataChunkSize = 4498170
sampleRate = 22050
channelsNumber = 16
bitsPerSample = 1

将这些值应用于公式,我们得到:

time = 4498170 / (22050 * 1 * 16 / 8)

结果是 102 秒(四舍五入)。深入解释 WAV 文件的结构超出了本文的范围。如果您想进一步研究它,请阅读我在处理这个问题时遇到的这些页面:

Audero Wav Extractor 是什么

Audero Wav Extractor 是一个 PHP 库,允许您从 WAV 文件中提取片段。您可以将提取的片段保存到本地硬盘、通过用户的浏览器下载或将其作为字符串返回以供以后处理。该库的唯一特殊要求是 PHP 5.3 或更高版本,因为它使用命名空间。库的所有类都在 WavExtractor 目录中,但您会注意到还有一个额外的 Loader 目录,您可以在其中找到库的自动加载器。开发人员的入口点是 AuderoWavExtractor 类,它具有项目中的三个主要方法:

  • downloadChunk():下载片段
  • saveChunk():将其保存到硬盘
  • getChunk():将片段作为字符串检索

所有这些方法的前两个参数都相同:$start$end,它们分别表示要提取的部分的起始和结束时间(以毫秒为单位)。此外,downloadChunk()saveChunk() 接受可选的第三个参数来设置提取片段的名称。如果未提供名称,则该方法会自行生成一个名称,格式为“InputFilename-Start-End.wav”。在 WavExtractor 目录中,有两个子文件夹:Utility,包含具有某些实用程序方法的 Converter 类;以及 Wav。后者包含 Wav、Chunk 和 ChunkField 类。第一个,正如您可能预期的那样,表示 WAV 文件,它由一个或多个块(Chunk 类型)组成。此类允许您检索 WAV 标头、音频持续时间和其他一些有用的信息。它最重要的方法是 getWavChunk(),该方法通过读取文件中的字节来检索指定的音频部分。Chunk 类表示 WAV 文件的一个块,它由 Chunk 文件夹中包含的专用类扩展。后者不支持所有现有的块类型,只支持最重要的块类型。未识别的部分由通用类管理,并在整个过程中被简单地忽略。最后描述的类是 ChunkField。正如我指出的那样,每个块都有其自己的类型和字段,并且每个字段都有不同的长度(以字节为单位)和格式。这是一个非常重要的信息,因为您需要传递正确的参数才能使用 PHP 的 pack()unpack() 函数正确解析字节,否则您将收到错误。为了帮助管理数据,我决定将它们包装到一个类中,该类保存每个字段的格式、大小和值。

如何使用 Audero Wav Extractor

您可以通过 Composer 获取“Audero Wav Extractor”,将以下几行添加到您的 composer.json 文件中并运行其安装命令:

"require": {
  "audero/audero-wav-extractor": "2.1.*"
}

Composer 将下载并将库放在项目的 vendor/audero 目录中。或者,您可以直接从其存储库下载库。要提取片段并强制下载到用户的浏览器,您将编写类似于以下代码的代码:

downloadChunk($start, $end, $outputFile);
  echo "Chunk extraction completed. ";
} catch (Exception $e) {
  echo "An error has occurred: " . $e->getMessage();
}

在第一行中,我包含了 Composer 自动加载器,然后设置了我将要使用的值。如您所见,我提供了源文件、包括文件名在内的输出路径以及我想提取的时间范围。然后,我创建了一个 AuderoWavExtractor 的实例,将源文件作为参数,然后调用 downloadChunk() 方法。请注意,因为输出路径是通过引用传递的,所以您始终需要将其设置为变量。让我们看另一个例子。我将向您展示如何选择时间范围并将文件保存到本地硬盘。此外,我将使用项目中包含的自动加载器。

saveChunk($start, $end);
  echo "Chunk extraction completed.";
} catch (Exception $e) {
  echo "An error has occurred: " . $e->getMessage();
}

除了加载器配置之外,该代码片段与之前的代码片段非常相似。事实上,我只做了两个更改:第一个是调用的方法,saveChunk() 而不是 downloadChunk(),第二个是我没有设置输出文件名(它将使用前面解释的默认格式)。

结论

在这篇文章中,我向您展示了“Audero Wav Extractor”以及如何轻松地从给定的 WAV 文件中提取一个或多个片段。我为一个工作项目编写了该库,该项目要求使用非常狭窄的磁贴集,因此如果 WAV 或其标头严重损坏,则该库可能会失败,但我编写了代码以尝试在可能的情况下从错误中恢复。随意使用存储库中包含的演示和文件,因为我已经在 CC BY-NC 3.0 许可下发布了它。

(以下为原文FAQ部分的伪原创,保持了原意,并对语言进行了调整)

关于从 WAV 文件中提取片段的常见问题解答 (FAQ)

如何提取 WAV 文件的特定部分?

要提取 WAV 文件的特定部分,您需要使用像 Audacity 这样的音频编辑软件。在 Audacity 中打开 WAV 文件,使用选择工具选择要提取的部分,然后从“文件”菜单中选择“导出选择”。然后,您可以将选定的部分保存为新的 WAV 文件。

我可以用编程语言从 WAV 文件中提取数据吗?

是的,您可以使用像 Python 这样的编程语言从 WAV 文件中提取数据。可以使用诸如 scipy.io.wavfilewave 之类的库来读取 WAV 文件并提取数据。然后,您可以根据您的需求操作这些数据。

如何从音频文件中提取秘密信息?

从音频文件中提取秘密信息涉及一个称为隐写术的过程。此过程涉及将信息隐藏在非秘密文本或数据中。有各种软件和工具可以帮助您从音频文件中提取隐藏的消息。

我可以从 WAV 文件中提取一个说话的声音或一个人说话的声音吗?

从 WAV 文件中提取一个声音是一项复杂的任务,它涉及音频源分离或语音分离。这可以使用高级信号处理技术和机器学习算法来实现。像 Audacity 这样的软件可以在一定程度上有所帮助,但是对于更复杂的任务,您可能需要使用更高级的工具或服务。

R 中哪个函数从 WAV 文件中提取 dB 值?

在 R 中,您可以使用 tuneR 包来读取 WAV 文件并提取数据。readWave() 函数可用于读取 WAV 文件,生成的物体可用于访问 dB 值。但是,您可能需要使用适当的数学公式将振幅值转换为 dB。

如何从 WAV 文件中提取频率信息?

从 WAV 文件中提取频率信息涉及对数据执行傅里叶变换。这可以使用 Python 中的 numpy 库或 R 中的 fft 库来完成。傅里叶变换的结果将为您提供音频信号的频率分量。

我可以从 WAV 文件中提取元数据吗?

是的,您可以从 WAV 文件中提取元数据。这可能包括采样率、位深度、声道数和持续时间等信息。这可以使用各种编程语言中的音频处理库来完成。

如何从 WAV 文件中提取多个部分?

要从 WAV 文件中提取多个部分,您可以使用像 Audacity 这样的音频编辑软件。您可以选择要提取的每个部分并将其导出为新文件。此过程可以针对要提取的每个部分重复进行。

我可以从视频文件中提取音频并将其保存为 WAV 文件吗?

是的,您可以从视频文件中提取音频并将其保存为 WAV 文件。这可以使用视频编辑软件或转换工具来完成。此过程涉及打开视频文件、提取音频轨道并将其保存为 WAV 文件。

如何将 WAV 文件转换为另一种音频格式?

要将 WAV 文件转换为另一种音频格式,您可以使用音频转换软件或工具。这些工具允许您打开 WAV 文件并将其保存为另一种格式,例如 MP3、FLAC 或 AAC。转换过程通常涉及选择输出格式并设置所需的质量或比特率。

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3