虽然 PHP 以构建网页和应用程序而闻名,但它的功能远不止于此。我最近需要动态地从 WAV 文件中提取一段音频,并允许用户通过浏览器下载。我尝试寻找符合我需求的库,但没有成功,不得不自己编写代码。这是一个深入研究 WAV 文件结构的好机会。在这篇文章中,我将简要概述 WAV 文件格式,并解释我开发的库:Audero Wav Extractor。
关键要点
downloadChunk()
、saveChunk()
和 getChunk()
等方法来管理提取过程。每种方法都需要提取片段的起始和结束时间参数。WAV 格式概述
波形音频文件格式,也称为 WAVE 或 WAV,是微软用于存储数字音频数据的文件格式标准。WAV 文件由一组不同类型的块组成,这些块代表音频文件的不同部分。您可以将此格式想象成 HTML 页面:第一个块就像网页的 <section></section>
部分,因此在其中您可以找到有关文件本身的几条信息,而包含音频数据本身的块则位于页面的 <section></section>
部分。在这种情况下,“块”指的是文件中包含的数据部分。最重要的格式块是“RIFF”,它包含文件的字节数;“Fmt”,它包含采样率和声道数等重要信息;以及“Data”,它实际上包含音频流数据。每个块至少必须有两个字段:id 和大小。此外,每个有效的 WAV 至少必须有两个块:Fmt 和 Data。第一个通常位于文件的开头,但在 RIFF 之后。每个块都有其自己的格式和字段,并且一个字段构成块的子部分。WAV 格式过去未被充分指定,这导致文件具有不严格遵循规则的标头。因此,当您处理音频时,您可能会发现一个文件具有一个或多个字段,甚至最重要的字段设置为零或错误的值。为了让您了解块内部的内容,每个 WAV 文件的第一个块是 RIFF。其前 4 个字节包含字符串“RIFF”,接下来的 4 个字节包含文件大小减去这两个数据部分使用的 8 个字节。RIFF 块的最后 4 个字节包含字符串“WAVE”。您可能会猜到这些数据的目的是什么。在这种情况下,您可以使用它们来识别您正在解析的文件实际上是否是 WAV 文件,就像我在库的 Wav 类中 setFilePath()
方法中所做的那样。另一个需要解释的有趣的事情是如何计算 WAV 文件的持续时间。您需要的所有信息都可以从前面提到的两个必须的块中检索,它们是:数据块大小、采样率、声道数和每样本位数。计算文件时间(以秒为单位)的公式如下:
<code>time = dataChunkSize / (sampleRate * channelsNumber * bitsPerSample / 8)</code>
假设我们有:
<code>dataChunkSize = 4498170 sampleRate = 22050 channelsNumber = 16 bitsPerSample = 1</code>
将这些值应用于公式,我们得到:
<code>time = 4498170 / (22050 * 1 * 16 / 8)</code>
结果是 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
文件中并运行其安装命令:
<code>time = dataChunkSize / (sampleRate * channelsNumber * bitsPerSample / 8)</code>
Composer 将下载并将库放在项目的 vendor/audero
目录中。或者,您可以直接从其存储库下载库。要提取片段并强制下载到用户的浏览器,您将编写类似于以下代码的代码:
<code>time = dataChunkSize / (sampleRate * channelsNumber * bitsPerSample / 8)</code>
在第一行中,我包含了 Composer 自动加载器,然后设置了我将要使用的值。如您所见,我提供了源文件、包括文件名在内的输出路径以及我想提取的时间范围。然后,我创建了一个 AuderoWavExtractor 的实例,将源文件作为参数,然后调用 downloadChunk()
方法。请注意,因为输出路径是通过引用传递的,所以您始终需要将其设置为变量。让我们看另一个例子。我将向您展示如何选择时间范围并将文件保存到本地硬盘。此外,我将使用项目中包含的自动加载器。
<code>dataChunkSize = 4498170 sampleRate = 22050 channelsNumber = 16 bitsPerSample = 1</code>
除了加载器配置之外,该代码片段与之前的代码片段非常相似。事实上,我只做了两个更改:第一个是调用的方法,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.wavfile
和 wave
之类的库来读取 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。转换过程通常涉及选择输出格式并设置所需的质量或比特率。
以上是PHP主|从WAV文件中提取摘录的详细内容。更多信息请关注PHP中文网其他相关文章!