PHP主|從WAV文件中提取摘錄
雖然 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 文件的結構超出了本文的範圍。如果您想進一步研究它,請閱讀我在處理這個問題時遇到的這些頁面:
- https://www.php.cn/link/21c1da87c1afdd4ed2836bdb521bea78
- https://www.php.cn/link/3493d96f8fcb16313a77ecfd294734c9
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP中有四種主要錯誤類型:1.Notice:最輕微,不會中斷程序,如訪問未定義變量;2.Warning:比Notice嚴重,不會終止程序,如包含不存在文件;3.FatalError:最嚴重,會終止程序,如調用不存在函數;4.ParseError:語法錯誤,會阻止程序執行,如忘記添加結束標籤。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

箭頭函數在PHP7.4中引入,是短閉包的簡化形式。 1)它們使用=>運算符定義,省略function和use關鍵字。 2)箭頭函數自動捕獲當前作用域變量,無需use關鍵字。 3)它們常用於回調函數和短小計算,提高代碼簡潔性和可讀性。

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。
