首頁 > 後端開發 > php教程 > PHP主|從WAV文件中提取摘錄

PHP主|從WAV文件中提取摘錄

Jennifer Aniston
發布: 2025-02-24 10:39:14
原創
836 人瀏覽過

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 文件的持續時間可以使用以下公式計算:<code>time = dataChunkSize / (sampleRate * channelsNumber * bitsPerSample / 8)</code>。此信息以及其他重要數據可以從 WAV 文件的“Data”和“Fmt”塊中檢索。

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.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。轉換過程通常涉及選擇輸出格式並設置所需的質量或比特率。

以上是PHP主|從WAV文件中提取摘錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板