Dans la programmation audio, la génération d'en-têtes de fichiers WAV standard est une étape de base mais critique. Les fichiers WAV sont des fichiers audio basés sur le format RIFF (Resource Interchange File Format), avec une structure claire et facile à lire. Cet article construira manuellement un en-tête de fichier WAV légitime via la fonction PHP Pack () , afin que les développeurs puissent comprendre plus profondément la structure du format WAV.
Un en-tête de fichier WAV standard peut être à peu près divisé en parties suivantes:
Bloc de riff : un fichier de balises est un fichier riff.
Indicateur d'onde : le type de fichier est de l'onde.
Sous-bloc FMT : contient des informations au format audio (taux d'échantillonnage, numéro de canal, débit binaire, etc.).
Sous-bloc de données : contient les données audio réelles.
La structure est la suivante:
| ChunkID | ChunkSize | Format |
|--------|-----------|--------|
| 'RIFF' | 36 + SubChunk2Size | 'WAVE' |
| Subchunk1ID | Subchunk1Size | AudioFormat | NumChannels | SampleRate | ByteRate | BlockAlign | BitsPerSample |
|-------------|----------------|-------------|-------------|------------|----------|-------------|----------------|
| Subchunk2ID | Subchunk2Size | Data |
La fonction PACT () de PHP peut emballer les données en chaînes binaires, ce qui convient à la construction d'en-têtes de fichiers WAV. Voici un exemple simple pour générer un en-tête de fichier WAV 16 bits, mono, 44.1 kHz, en supposant que la taille des données audio est $ dataSize octets:
<?php
function createWavHeader($dataSize, $sampleRate = 44100, $bitsPerSample = 16, $channels = 1)
{
$byteRate = $sampleRate * $channels * $bitsPerSample / 8;
$blockAlign = $channels * $bitsPerSample / 8;
$header = '';
// RIFF Header
$header .= pack('A4', 'RIFF'); // ChunkID
$header .= pack('V', 36 + $dataSize); // ChunkSize
$header .= pack('A4', 'WAVE'); // Format
// fmt Subchunk
$header .= pack('A4', 'fmt '); // Subchunk1ID
$header .= pack('V', 16); // Subchunk1Size
$header .= pack('v', 1); // AudioFormat (1 = PCM)
$header .= pack('v', $channels); // NumChannels
$header .= pack('V', $sampleRate); // SampleRate
$header .= pack('V', $byteRate); // ByteRate
$header .= pack('v', $blockAlign); // BlockAlign
$header .= pack('v', $bitsPerSample); // BitsPerSample
// data Subchunk
$header .= pack('A4', 'data'); // Subchunk2ID
$header .= pack('V', $dataSize); // Subchunk2Size
return $header;
}
// Exemple:Écrivez un vide WAV document
$dataSize = 44100 * 2 * 1; // 1Mono en quelques secondes16Données audio bits
$header = createWavHeader($dataSize);
file_put_contents('output.wav', $header . str_repeat("\x00", $dataSize));
echo "WAV document已创建。Disponible dans m66.net 下载测试document。";
$ Samplerate : Le taux d'échantillonnage, les valeurs communes sont 44100, 48000, etc.
$ BitsPersample : La profondeur du bit de chaque échantillon, généralement 8 ou 16.
$ canaux : nombre de canaux, 1 est mono, 2 est stéréo.
$ dataSize : le nombre réel d'octets des données audio, calculé comme: secondes * Taux d'échantillonnage * canal * Bit Depth / 8 .
La construction d'en-têtes de fichiers WAV à l'aide de pack () est idéale pour une utilisation dans les scénarios suivants:
Générez dynamiquement des flux audio du côté serveur.
Exportation du format d'enregistrement audio personnalisé.
Développement d'outils de compression de données et d'emballage audio.